Verilog 常量表达式的操作数非法
我正在尝试构建一个任务,该任务必须深入到某种层次结构中,能够简洁地比较特定实例上的不同管脚。特别是,我想做如下工作:Verilog 常量表达式的操作数非法,verilog,cadence,Verilog,Cadence,我正在尝试构建一个任务,该任务必须深入到某种层次结构中,能够简洁地比较特定实例上的不同管脚。特别是,我想做如下工作: 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
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\u 0.PIN\u FIRST;。这只是为了测试目的,顺便说一下,不是任何可合成的东西
有人能解释为什么这是不允许的,并提出不同的解决方案吗?看起来我需要为每一个循环迭代编写一个任务,这似乎是不必要的臃肿和丑陋
谢谢你回答我自己的问题,答案是没有办法用Verilog完成。就功能而言,Verilog语言是一种极其愚蠢的语言,并且,对于一项任务,它只能支持模块实例的常量索引。不可能有循环。我认为你对Verilog有点太苛刻了!你的模拟器的版本是什么?Verilog 2001支持生成循环。您是否尝试过使用这样的循环编写代码?我已经启用了2001。问题不在于生成循环,我为实际设计准备了这些循环。上面我想要的只是一个绕过逻辑的测试,因此我需要深入研究已有的层次结构。此测试上下文中的Generate语句无效,我只需要一种方法来循环现有多个模块实例上的值。不幸的是,Verilog不允许这种类型的循环;所有索引都必须明确指定,因此任何循环都必须手动展开。