5

これは許されますか?

input w;
     input [8:0]y;
     output reg [8:0]x;
     always@(w)
     begin


     //x[0] or A is never on in any next state
     assign x[0] = 0;
     assign x[1]= (y[0]&~w) | (y[5]&~w) | (y[6]&~w) | (y[7]&~w) | (y[8]&~w); //B
     assign x[2]= (y[1]&~w); //C
     assign x[3]= (y[2]&~w); //D
     assign x[4]= (y[3]&~w) | (y[4]&~w); //E
     assign x[5]= (y[0]&w) | (y[1]&w) | (y[2]&w) | (y[3]&w) | (y[4]&w); //F
     assign x[6]= (y[5]&w);
     assign x[7]= (y[6]&w);
     assign x[8]= (y[7]&w) | (y[8]&w);

     end
4

7 に答える 7

9

できます、それは「手続き型連続割り当て」と呼ばれます。通常の手続き型の割り当てをオーバーライドします。投稿したコードにはそれらの呼び出しがないようです。それらが合成可能かどうかはわかりませんが、とにかくそれらを使用する理由はありません.

コードに関するメモ -yセンシティビティ リストに含まれていません: たとえばalways @( w or y )、oralways @(*)の方が安全です。

于 2009-10-29T11:20:55.173 に答える
6

マーティの回答に基づいて、IEEE Verilog 標準 (たとえば、1364-2005) のセクション 9.3 を読む必要があります。ここでは、「手続き型連続代入」について説明しています。仕様では、ブロックassign内のステートメントが許可されています。alwaysしかし、私の経験からすると、それは非常にまれです。

コードのもう 1 つの問題は、私が試した 2 つの異なるシミュレーターでコンパイル エラーが発生することです。どちらも、割り当ての左側でビット選択または部分選択を使用できないというエラー メッセージを生成します。

別の可能な解決策は、ブロックを取り除き、always単純な連続割り当てを使用することです。

input w;     
input [8:0] y;
output [8:0] x;
assign x[0] = 0;     
assign x[1]= (y[0]&~w) | (y[5]&~w) | (y[6]&~w) | (y[7]&~w) | (y[8]&~w); //B     
assign x[2]= (y[1]&~w); //C     
assign x[3]= (y[2]&~w); //D     
assign x[4]= (y[3]&~w) | (y[4]&~w); //E     
assign x[5]= (y[0]&w) | (y[1]&w) | (y[2]&w) | (y[3]&w) | (y[4]&w); //F     
assign x[6]= (y[5]&w);     
assign x[7]= (y[6]&w);     
assign x[8]= (y[7]&w) | (y[8]&w);
于 2009-10-29T23:54:45.507 に答える
2

Assign は、Verilog でワイヤと共に使用される連続代入ステートメントです。assign ステートメントは、常になどの手続き型ブロック内には入りません。レジスタには、always ブロックで値を指定できます。

割り当てステートメントは、次のように表示できます。

 always @(*)

ワイヤーのステートメント。

于 2014-04-28T09:45:50.350 に答える
0

はい、しかしあなたはしたくありません。x[] は x[] に依存しないため、順序は関係ありません。assign = の代わりに <= を使用してください。

于 2009-10-29T19:09:57.267 に答える