2016-11-30 6 views
1

多次元配列を使用して他のモジュールのカウンタで索引付けできるハードコードされた定数配列を送信しようとしています。SystemVerilog:割り当てパターン要素<name>:要素の幅が一致しません(エラー:vlog-7034)

私の現在の戦略は、コンパイルとデプロイを行うパラメータ配列を使用することですが、各配列要素の最初のビットのみがハードウェア上で一度考慮されます。これは、RTLビューに反映ので、私はModelSimのために行って、このエラーを受信しました:

Error: (vlog-7034) <path>(<line>): Array assignment to type 'reg[9:0] $[19:0]' from type 'reg $[19:0]': Assignment pattern element 'NoMove': Element widths (10, 1) don't match 

私のコードはここにある:

module EScheduler(input Clk, Reset, 
       output reg [9:0] ESchedCtr, 
       output reg [9:0] ESchedX [NE - 1:0][NM - 1:0], ESchedY [NE - 1:0][NM - 1:0], 
       output reg [9:0] EShipInitialX [NE - 1:0], EShipInitialY [NE - 1:0], 
       output reg ESchedFire [NE - 1:0][NM - 1:0]); 
    logic clkby2; 
    initial clkby2 = 0; 
    always_ff @ (posedge Clk) 
    begin 
     clkby2 <= ~clkby2; 
    end 
    parameter PlusOne = 10'b1; 
    parameter MinusOne = (~(PlusOne) + 10'b1); 
    parameter reg NoMove [NM - 1:0] = '{10'd0, 10'd0, 10'd0, 10'd0, 10'd0, 
             10'd0, 10'd0, 10'd0, 10'd0, 10'd0, 
             10'd0, 10'd0, 10'd0, 10'd0, 10'd0, 
             10'd0, 10'd0, 10'd0, 10'd0, 10'd0}; 
    parameter reg CircleX [NM - 1:0] = '{ PlusOne, PlusOne, PlusOne, PlusOne, PlusOne, 
              MinusOne, MinusOne, MinusOne, MinusOne, MinusOne, 
              MinusOne, MinusOne, MinusOne, MinusOne, MinusOne, 
              PlusOne, PlusOne, PlusOne, PlusOne, PlusOne}; 
    parameter reg CircleY [NM - 1:0] = '{ PlusOne, PlusOne, PlusOne, PlusOne, PlusOne, 
              PlusOne, PlusOne, PlusOne, PlusOne, PlusOne, 
              MinusOne, MinusOne, MinusOne, MinusOne, MinusOne, 
              MinusOne, MinusOne, MinusOne, MinusOne, MinusOne}; 
    parameter reg BackAndForth [NM - 1:0] = '{ PlusOne, MinusOne, PlusOne, MinusOne, PlusOne, 
               MinusOne, PlusOne, MinusOne, PlusOne, MinusOne, 
               PlusOne, MinusOne, PlusOne, MinusOne, PlusOne, 
               MinusOne, PlusOne, MinusOne, PlusOne, MinusOne}; 
    parameter reg FireOnFrame13 [NM - 1:0] = '{1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 
            1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 
            1'b0, 1'b0, 1'b1, 1'b1, 1'b1, 
            1'b0, 1'b0, 1'b0, 1'b0, 1'b0 }; 
    always_ff @ (posedge clkby2) 
    begin 
     if(Reset == 1'b1) 
     begin 
      ESchedCtr <= 10'b0; 
     end 
     else 
     begin 
      if(ESchedCtr >= NM - 1) 
       ESchedCtr <= 10'b0; 
      else 
       ESchedCtr <= ESchedCtr + 10'b1; 
     end 
     ESchedFire <= '{ FireOnFrame13, FireOnFrame13, 
       FireOnFrame13, FireOnFrame13, 
       FireOnFrame13, FireOnFrame13, 
       FireOnFrame13, FireOnFrame13, 
       FireOnFrame13, FireOnFrame13 }; 
    end 
    always_comb 
    begin 
     EShipInitialX = '{10'd020, 10'd080, 10'd140, 10'd200, 10'd260, 10'd320, 10'd380, 10'd440, 10'd500, 10'd560}; 
     EShipInitialY = '{10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040}; 
     ESchedX = '{9: CircleX, 8: BackAndForth, 7: CircleY, 6: NoMove, 5: NoMove, 
        4: NoMove, 3: NoMove, 2: NoMove, 1: NoMove, 0: NoMove}; 
     ESchedY = '{CircleY, NoMove, CircleX, NoMove, NoMove, 
        NoMove, NoMove, NoMove, NoMove, NoMove}; 
    end 
endmodule 

私はここで提供さ答えを使用して開始しました:https://verificationacademy.com/forums/systemverilog/working-multi-dimensional-associative-arrays

コロンを使用して、各要素が存在するインデックスを定義しますが、これは成功しませんでした。このエラーに関する他の言及は、Googleの検索には登場しません。

答えて

0

愚かな間違い、幸いにも。私は他の人が検索結果にこのエラーコードを見てから恩恵を受けることができるように、このソリューションを任せるつもり

parameter reg [9:0] CircleX [NM - 1:0] = '{ PlusOne, PlusOne, PlusOne, PlusOne, PlusOne, 
             MinusOne, MinusOne, MinusOne, MinusOne, MinusOne, 
             MinusOne, MinusOne, MinusOne, MinusOne, MinusOne, 
             PlusOne, PlusOne, PlusOne, PlusOne, PlusOne}; 
parameter reg [9:0] CircleY [NM - 1:0] = '{ PlusOne, PlusOne, PlusOne, PlusOne, PlusOne, 
             PlusOne, PlusOne, PlusOne, PlusOne, PlusOne, 
             MinusOne, MinusOne, MinusOne, MinusOne, MinusOne, 
             MinusOne, MinusOne, MinusOne, MinusOne, MinusOne}; 
parameter reg [9:0] BackAndForth [NM - 1:0] = '{ PlusOne, MinusOne, PlusOne, MinusOne, PlusOne, 
              MinusOne, PlusOne, MinusOne, PlusOne, MinusOne, 
              PlusOne, MinusOne, PlusOne, MinusOne, PlusOne, 
              MinusOne, PlusOne, MinusOne, PlusOne, MinusOne}; 
parameter reg FireOnFrame13 [NM - 1:0] = '{1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 
           1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 
           1'b0, 1'b0, 1'b1, 1'b1, 1'b1, 
           1'b0, 1'b0, 1'b0, 1'b0, 1'b0 }; 

:私は、パラメータ宣言でフィールド幅を含めるのを忘れていました。

+0

ビット操作を使用して数値を無効にすることは、コードをデバッグする他の人には明らかではなく、合成ツールによる最適化の実行を妨げる可能性があります。また、 'PlusOne'と' MinusOne'は読みにくいです。署名付きの値を使用する方が良い 'パラメータ署名[9:0] BackAndForth [NM-1:0] = {1、-1、1、... ' – nguthrie

+0

ありがとう。私は若干の初心者ですが、コースのインストラクターは2つの補数を使って数字を無効にしていました。 – ijustlovemath

関連する問題