我试图在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。思考?
答案 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(都是〜^和^〜)。