我正在尝试构建一个任务,该任务必须深入研究一些层次结构,可以简明地比较特定实例上的不同引脚。特别是,我想做以下事情:
task check_expected;
input integer pin;
input [9:0] expected;
integer i, j;
reg [9:0] check;
begin
j = 0;
for (i = 0; i < 20; i = i + 1) begin
case (pin)
0: begin
check[0] = test.inst[i].lane_0.PIN_FIRST;
check[1] = test.inst[i].lane_1.PIN_FIRST;
...
check[9] = test.inst[i].lane_9.PIN_FIRST;
end
1: begin
check[0] = test.inst[i].lane_0.PIN_SECOND;
check[1] = test.inst[i].lane_1.PIN_SECOND;
...
check[9] = test.inst[i].lane_9.PIN_SECOND;
end
...
9: begin
check[0] = test.inst[i].lane_0.PIN_TENTH;
check[1] = test.inst[i].lane_1.PIN_TENTH;
...
check[9] = test.inst[i].lane_9.PIN_TENTH;
end
endcase
if (check[0] !== expected[j*10 + 0]) begin
TEST_FAILED = TEST_FAILED + 1;
$display("ERROR Expected=%b, @ %0t",expected[j*10 + 0],$time);
end
if (check[1] !== expected[j*10 + 1]) begin
TEST_FAILED = TEST_FAILED + 1;
$display("ERROR Expected=%b, @ %0t",expected[j*10 + 1],$time);
end
...
if (check[9] !== expected[j*10 + 9]) begin
TEST_FAILED = TEST_FAILED + 1;
$display("ERROR Expected=%b, @ %0t",expected[j*10 + 9],$time);
end
end
end
endtask
不幸的是,尝试执行上述操作会在细化过程中引发 NOTPAR 错误,声称将寄存器分配给非常数是不可接受的(它不喜欢任何行,如check[0] = test.inst[i].lane_0.PIN_FIRST;
)。顺便说一下,这只是为了测试目的,而不是任何可综合的东西。
有人可以解释为什么不允许这样做并提出不同的解决方案吗?看起来我需要为每个循环迭代编写一个任务,这似乎会变得不必要地臃肿和丑陋。
谢谢