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 减少位两个输入的与非。想法?

4

3 回答 3

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 回答
2

我会尝试将这一行重写为:

1: flag <= |(~(inputA & inputB));
于 2012-11-05T00:45:58.177 回答
0

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

于 2012-11-05T04:06:13.640 回答