Bug #9055
closedTexas97IFetchVerilogPrinterTestCase: java.lang.IndexOutOfBoundsException: 4294967283 is out of bounds.
0%
Description
Тест компонента VerilogPrinter под названием Texas97IFetchVerilogPrinterTestCase для описания IFetch.v (проект Retrascope MC Benchmark) падает со следующим стеком ошибки:
java.lang.IndexOutOfBoundsException: 4294967283 is out of bounds.
at ru.ispras.fortress.expression.NodeOperation.getParams(NodeOperation.java:273)
at ru.ispras.fortress.expression.NodeOperation.getDataType(NodeOperation.java:196)
at ru.ispras.fortress.expression.Node.isType(Node.java:177)
at ru.ispras.fortress.expression.ExprUtils.isType(ExprUtils.java:84)
at ru.ispras.verilog.parser.processor.VerilogExprTransformer$3.apply(VerilogExprTransformer.java:215)
at ru.ispras.fortress.transformer.NodeTransformer.applyRule(NodeTransformer.java:169)
at ru.ispras.fortress.transformer.NodeTransformer.onOperationEnd(NodeTransformer.java:229)
at ru.ispras.fortress.expression.ExprTreeWalker.visitOperation(ExprTreeWalker.java:173)
at ru.ispras.fortress.expression.ExprTreeWalker.visitNode(ExprTreeWalker.java:123)
at ru.ispras.fortress.expression.ExprTreeWalker.visitOperation(ExprTreeWalker.java:160)
at ru.ispras.fortress.expression.ExprTreeWalker.visitNode(ExprTreeWalker.java:123)
at ru.ispras.fortress.expression.ExprTreeWalker.visit(ExprTreeWalker.java:93)
at ru.ispras.fortress.transformer.NodeTransformer.walk(NodeTransformer.java:54)
at ru.ispras.fortress.transformer.Transformer.transform(Transformer.java:230)
at ru.ispras.verilog.parser.processor.VerilogExprTransformer.transform(VerilogExprTransformer.java:62)
at ru.ispras.verilog.parser.elaborator.VerilogTransformer.transform(VerilogTransformer.java:180)
at ru.ispras.verilog.parser.elaborator.VerilogTransformer.transform(VerilogTransformer.java:191)
at ru.ispras.verilog.parser.elaborator.VerilogTransformer.transform(VerilogTransformer.java:210)
at ru.ispras.verilog.parser.elaborator.VerilogTransformer.onAssignStatementBegin(VerilogTransformer.java:83)
at ru.ispras.verilog.parser.walker.VerilogNodeVisitor$3.onBegin(VerilogNodeVisitor.java:265)
at ru.ispras.verilog.parser.walker.VerilogNodeVisitor.onBegin(VerilogNodeVisitor.java:700)
at ru.ispras.verilog.parser.core.TreeWalker.onBegin(TreeWalker.java:100)
at ru.ispras.verilog.parser.core.TreeWalker.start(TreeWalker.java:79)
at ru.ispras.verilog.parser.elaborator.VerilogTransformer.run(VerilogTransformer.java:54)
at ru.ispras.verilog.parser.elaborator.VerilogRangeTransformer.transform(VerilogRangeTransformer.java:56)
at ru.ispras.verilog.parser.elaborator.VerilogInstantiator.instantiate(VerilogInstantiator.java:108)
at ru.ispras.verilog.parser.elaborator.VerilogInstantiator.instantiateProcess(VerilogInstantiator.java:84)
at ru.ispras.verilog.parser.elaborator.VerilogDesign$1$1.next(VerilogDesign.java:180)
at ru.ispras.verilog.parser.elaborator.VerilogDesign$1$1.next(VerilogDesign.java:168)
at ru.ispras.verilog.parser.sample.VerilogDesignPrinter.start(VerilogDesignPrinter.java:36)
at ru.ispras.verilog.parser.VerilogDesignBackends.start(VerilogDesignBackends.java:56)
at ru.ispras.verilog.parser.VerilogTranslator.start(VerilogTranslator.java:169)
at ru.ispras.verilog.parser.sample.VerilogPrinter.main(VerilogPrinter.java:45)
at ru.ispras.verilog.parser.sample.VerilogPrinterTest.runTest(VerilogPrinterTest.java:49)
Проблема, по всей видимости, там в следующем. В модуле instrFetch декларируется переменная:
output [29:0] InstrAddr_s2i;
Это модуль верхнего уровня, в котором инстанцируются модули IFetchDatapath и PCUnitDatapath. В модуле IFetchDatapath декларируется переменная с тем же именем, но другого типа:
input [29:13] InstrAddr_s2i;
В binding'е по данной переменной из модуля верхнего уровня передается InstrAddr_s2i[29:13].
Наконец, в модуле PCUnitDatapath переменная с тем же именем декларируется так:
output [29:0] InstrAddr_s2i;
и в нем же она используется в присваивании (выражение, на котором происходит падение, я выделил жирным):
assign PC_Original_s2i = {InstrAddr_s2i[29:1], InstrAddr_s2i0 & MipsMode_s2e};
Однако, когда выражение в правой части присваивания проходит элаборацию, в класс VerilogRangeTransformer
приходит offset, равный 13, которой вычитается из 0. Получается отрицательное число, которое затем преобразуется в число,
выбрасываемое исключением. offset здесь быть не должно, т.к. в данном модуле переменная InstrAddr_s2i адресуется
с 0 до 29.