常量表达的非法操作数

时间:2015-01-08 01:01:13

标签: 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: 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;之类的任何行。这只是出于测试目的,而不是任何可合成的东西。

有人可以解释为什么不允许这样做并提出不同的解决方案吗?它看起来像是我需要为每个循环迭代编写一个任务,这似乎是不必要的臃肿和丑陋。

由于

1 个答案:

答案 0 :(得分:1)

要回答我自己的问题,答案是Verilog无法做到这一点。 Verilog是一种令人难以置信的愚蠢(在功能方面)语言,并且,通过任务,只能支持模块实例的常量索引。没有循环是可能的。