0

Verilog で if else ステートメントを使用したいだけです。したがって、常にブロックを使用する必要があります。

integer count,index;
reg a=0;
always@(a) begin
   a=1;
   for(count=0;count<7;count=count+1) begin
      index=4*count;
      if((significand[index]==1'b0)&&(significand[index+1]==1'b0)&&
     (significand[ind‌​ex+2]==1'b0) &&(significand[index+3]==1'b0))
    lzero=lzero+1;
   end
end

このコードは今ではある程度意味があります。正しいシミュレーション結果を得ることができましたが、ボード上で正しい合成を得ることができませんでした。助けてください

4

2 に答える 2

4

これは、C または C++ でプログラミングする方法を知っているが、Verilog と VHDL がそれらと同じではないことを忘れている人々にとって非常に典型的な問題です。

ALWAYSブロック内の Verilog コードのすべての信号線が同時に「実行」されます。同じことが、ALWAYS ブロックの外側の組み合わせロジックにも当てはまります。

あなたのコードでは、両方

assign a=1'b1;

assign a=1'b0;

何があっても同時に起こります。

これを変更する唯一の方法は、for ループの end ステートメントの後に、always ブロック内に最後の行を配置することです。

C と Verilog の違いを理解するのに役立つページの 1 つは、EE-Times: The C Programmers Guide to Verilog です。

于 2012-06-30T18:01:36.687 に答える
2

どちらassign 1'b1;assign 1'b0;有効な割り当てではありません。で常にネットを動かしたい場合1'b1は、 のようなものを書く必要がありますassign myvar = 1'b1;

また、意図が実際に に割り当てることであった場合、値が変更されるたびにそのブロックを実行する必要があることを意味する機密リストの唯一のものであるaため、常にブロックは意味がありません。は基本的にその値を変更しないため、そのブロックは決して実行されるべきではありません。aaa

問題を示す最小限の実例を提供しない限り、あなたを助けることは困難です。私がお勧めできる唯一のことは、右側のステートメントで三項演算子を使用することです。そうすれば、ブロックassignを使用せずに行動ロジックをモデル化できます。always例えば:

assign a = (b == 1'b1 ? c : 1'b0); 

それが役に立てば幸い。

アップデート:

2 番目のコード例は、完全でも合法でもありません。同じネットに 2 つの組み合わせを割り当てることはできません。

ただし、always ブロック内のセンシティビティ リストはスターになりました。これは、右側のすべてのオペランドをセンシティビティ リストに自動的に含めるための Verilog 2001 表記です。あなたの場合、ブロックは毎回実行されるsignificandか、lzero変更されます。

于 2012-06-29T18:40:56.073 に答える