0

私はverilogで32ビットALUを構築しようとしていますが、以前は動作verilogを少ししか実行したことがないため、このコードで問題が発生しています。

module ZERO_FLAG(flag, control, inputA, inputB);
  input [2:0] control;
  input [31:0] inputA, inputB;
  output flag;

  reg flag;

  always @(control or inputA or inputB) begin
    case (control)
      1: flag <= (|(inputA ~& inputB));
      3'bxxx, 3'bxx0, 3'bxx1, 3'bx0x,
      3'bx00, 3'bx01, 3'bx1x, 3'bx10,
      3'bx11, 3'b0xx, 3'b0x0, 3'b0x1,
      3'b00x, 3'b000, 3'b01x, 3'b010,
      3'b011, 3'b1xx, 3'b1x0, 3'b1x1,
      3'b10x, 3'b100, 3'b101, 3'b11x,
      3'b110, 3'b111: flag <= 0;
    endcase
  end
endmodule

何らかの理由で、Modelsimは1の場合、inputAとinputBの間のNANDに不満を持っています。基本的な考え方は、減算が行われているときにゼロフラグをスローするだけで、結果をビット単位でORに減らすことです。 2つの入力のNAND。考え?

4

3 に答える 3

2

行を次のように書き直してみます。

1: flag <= |(~(inputA & inputB));
于 2012-11-05T00:45:58.177 に答える
2

IEEE 1364.1-2002 A.8.6では、これ~&は有効なVerilog構文ですが、単項演算子としてのみ使用できるという他の回答を補足するために言及する価値があります。これは、右サイドの引数のみを取ることを意味します。

 &(4'b0000) => 1'b0
 &(4'b0101) => 1'b0
 &(4'b1111) => 1'b1

~&(4'b0000) => 1'b1
~&(4'b0101) => 1'b1
~&(4'b1111) => 1'b0

使用可能な単項演算子は次のとおりです。

+, -, !, ~, &, ~&, |, ~|, ^, ~^, ^~

これらのうち、&, ~&, |, ~|, ^, ~^, ^~削減演算子は、上記のように1ビット値に削減されます。は^XORを意味します。

使用可能なビット演算子:

+, -, *, /, %, ==, !=, ===, !==, &&, ||, **,
<, <=, >, >=, &, |, ^, ^~, ~^, >>, <<, >>>, <<<
于 2012-11-05T08:40:39.653 に答える
0

残念ながら、VerilogにはバイナリNANDはありません。唯一のバイナリビット演算子は、AND(&)、OR(|)、XOR(^)、およびXNOR(〜^と^〜の両方)です。

于 2012-11-05T04:06:13.640 に答える