verilog问题中的零旗

时间:2012-11-05 00:08:42

标签: verilog modelsim

我试图在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

出于某种原因,在1的情况下,Modelsim对inputA和inputB之间的NAND感到不满意。基本思路是我只想在减法发生时抛出零标志,然后我希望结果是或者减少两个输入的按位NAND。思考?

3 个答案:

答案 0 :(得分:2)

我会尝试将该行重写为:

1: flag <= |(~(inputA & inputB));

答案 1 :(得分: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位值。 ^表示异或。

可用的按位运算符:

+, -, *, /, %, ==, !=, ===, !==, &&, ||, **,
<, <=, >, >=, &, |, ^, ^~, ~^, >>, <<, >>>, <<<

答案 2 :(得分:0)

不幸的是,Verilog中没有二进制NAND。唯一的二进制位运算符是AND(&amp;),OR(|),XOR(^)和XNOR(都是〜^和^〜)。