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不允许这种类型的循环;所有索引都必须明确指定,因此任何循环都必须手动展开。