2017-08-07 10 views
-2

私はforループで16進数を使用する必要があるsystemverilogにこのコードを書いています。私は構文とコードの下で試しています。Verilogの16進値はforループを生成します

genvar i,j; 

localparam int i_d = 1; 

localparam int j_d = 134; 

generate 

for (i = 8'h01; i <= MAX1; i = i + INCR) 

begin 

    add_bit[i_d] = (creg_add == i); 

    i_d = i_d + 1; 

end 

for (j = 8'h86; j <= MAX2; j = j + INCR) 

begin 

    add_bit[j_d] = (creg_add == j); 

    j_d = j_d + 1; 

end 

endgenerate 

しかし、私はこのエラーに直面しています。誰かがここで私を助けることができる?

Error-[SE] Syntax error 
Following verilog source has syntax error : 
    "creg.vs", 
    715: token is '[' 
       add_bit[i_d] = (creg_add == i); 
      ^
+0

「add_bit」とは何ですか?おそらく 'assign ad_bit [i_d] = ....'が必要です。私は、これは重複していると思う:https://stackoverflow.com/questions/45491164/getting-the-invalid-module-instantiation-in-my-fir-verilog-code – Serge

+0

あなたは 'add_bit'を何と定義しましたか? –

+0

add_bitは論理として定義されています –

答えて

0

これは問題を解決するはずです。

genvar i,j; 

localparam int i_d = 1; 

localparam int j_d = 134; 

generate 

for (i = 8'h01; i <= MAX1; i = i + INCR) 

begin 

    assign add_bit[i_d] = (creg_add == i); 

    i_d = i_d + 1; 

end 

for (j = 8'h86; j <= MAX2; j = j + INCR) 

begin 

    assign add_bit[j_d] = (creg_add == j); 

    j_d = j_d + 1; 

end 

endgenerate 
+1

これは 'i_d' /' j_d'がインクリメントされるのでコンパイルされません。 'assign'を追加するのはlocalparams(別名定数)なので動作しません。 – Greg

+0

これはコンパイルされませんか? –

2

generateブロックは、精緻化時間(シミュレーション前)で評価されます。ブロック内にalwaysブロック、assignステートメント、モジュールインスタンス、およびローカルスコープの変数縮約を含めることができます。 alwaysブロックまたはassignステートメントの外部で連続的に更新される値を直接割り当てることはできません。

localparamは定数であるため、i_d = i_d + 1という行は無効です。

より簡単な解決策は、組み合わせの常時ブロックで手続き割り当てを使用することです。

int i,j; 
int i_d, j_d; 
logic [WIDTH:0] add_bit; 

always_comb begin 
    i_d = 1; 
    j_d = 134; 
    add_bit = '0; // fill zeros in case of gap between last i_d and first j_d 
    for (i = 8'h01; i <= MAX1; i = i + INCR) 
    begin 
    add_bit[i_d] = (creg_add == i); 
    i_d = i_d + 1; 
    end 
    for (j = 8'h86; j <= MAX2; j = j + INCR) 
    begin 
    add_bit[j_d] = (creg_add == j); 
    j_d = j_d + 1; 
    end 
end 
+0

助けてくれてありがとう。 add_bit [i_d]を使用する代わりに、add_bit [i]を使用できますか?インデックスの16進値を理解できるでしょうか? –

+0

基数は関係ありません(hex、dec、bin、oct)。どの基数でも扱いやすくなります。 '134'と' 8'h86'は等価でほとんど交換可能です。私は 'INCR'が1より大きいと推測しています。これは' i'と 'i_d'が同じ変数でない理由を説明します。 – Greg