2012-11-05 77 views
0

我試圖用Verilog建立一個32位ALU和我只做過行爲的Verilog的一個小一點,所以我有一些困難,與此代碼:零標誌的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不滿意。基本思想是,我只想在減法發生時拋出一個零標誌,然後我希望結果是一個或減少的兩個輸入的按位NAND。思考?

+0

NB'默認:標誌<= 0;'可能比,更容易'3'bxxx,3'bxx0,3'bxx1,3'bx0x,... ' – Morgan

回答

2

我會嘗試重寫路線爲:

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

一個甜蜜的,有效的,但也顯然我應該一直使用&〜。它也有效,一旦我切換到^,就像我應該爲零標誌,但這也適用! –

0

不幸的是,以Verilog沒有二進制NAND。唯一的二進制位運算符是AND(&),OR(|),XOR(^)和XNOR(都是^和^〜)。

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個比特值。 ^意味着異或。

可用位運算符:

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