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_0.PIN_FIRST;)。ちなみに、これはテスト用であり、合成可能なものではありません。

誰かがこれが許可されていない理由を説明し、別の解決策を提案できますか? ループの反復ごとにタスクを作成する必要があるように見えますが、それは不必要に肥大化して醜いものになるようです。

ありがとう

4

1 に答える 1