2016-09-23 66 views
-1

我寫一個簡單的ALU的Verilog這樣的:的ALU用Verilog,沒有輸出的同時模擬

input [15:0] in; 
output reg [15:0] out; 

reg [15:0] r [0:7]; 
reg [3:0] opcode; 
reg [3:0] outreg; 
reg [3:0] var1, var2; 
reg [15:0] a1, a2; 

parameter STO = 4'b0000; 
parameter ADD = 4'b0001; 
parameter MUL = 4'b0010; 

always @ (in) 
begin 

    opcode = in [15:12]; 
    outreg = in [11:8]; 
    var1 = in [7:4]; 
    var2 = in [3:0]; 
    a1 = (var1[3]) ? var1[2:0] : r[var1]; 
    a2 = (var2[3]) ? var2[2:0] : r[var2]; 
    case (opcode) 
     STO: begin r[outreg] = a1; end 
     ADD: begin r[outreg] = a1 + a2; end 
     MUL: begin r[outreg] = a1 * a2; end 
     SUB: begin r[outreg] = a1 - a2; end 
     DIV: begin r[outreg] = a1/a2; end 
     default: begin $display("error input"); end 
    endcase 
    out = r[outreg]; 
end 

而且在試驗檯上,我給這樣的輸入:

initial begin 
$monitor("%d", out); 
in = 16'h0280; #10; // STO r2, #0 
in = 16'h00d0; #10; // STO r0, #5 
in = 16'h01c0; #10; // STO r1, #4 
in = 16'h2110; #10; // MUL r1, r1, r0 
in = 16'h1221; #10; // ADD r2, r2, r1 
end 

結果應該(正如我預測的那樣)

0 
5 
4 
20 
20 

對嗎?

但ModelSim的顯示了答案如下:

0 
5 
4 
20 

並沒有

ADD r2, r2, r0 

輸出是我的答案正確預測?或者發生了什麼問題?

+0

發佈您的完整代碼。編譯錯誤太多(沒有模塊關鍵字,SUB/DIV沒有聲明等)。 – toolic

+1

要查看兩個20年代,將'$ monitor'行更改爲:'$ monitor(「%h,%d」,in,out);' – toolic

+0

謝謝,我只發佈我的代碼的關鍵部分,SUB/DIV不是用於測試,我忘了刪除這兩行,我可以處理其他問題。改變'$ monitor'後,顯示兩行'20'。但爲什麼只有一個'20'顯示'$ monitor(「%d」,out)'? –

回答

0

$monitor顯示其參數的值每個ANY的任何參數更改值。你怎麼能期待兩行20

Ref

+0

這將顯示2 20的,因爲OP的願望:'$ monitor(「%h,%d」,in,out);' – toolic

+0

我看到的唯一線是:'$ monitor(「%d」,out);' –

+0

我有5行輸入'$ monitor(「%d」,out);'只顯示4個輸出..但是'$ monitor(「%h,% d「,in,out);'可以顯示5行。 –

0
$monitor("%d", out); 

相當於寫這作爲一個單獨的過程。

always @(out) 
    $strobe("%d", out); // like $display except prints only once at the end of the time slot 

$monitor("%h %d", in,out); 

相當於寫這作爲一個單獨的過程。

always @(in or out) 
    $strobe("%h %d", in,out); // like $display except prints only once at the end of the time slot 

作爲一般規則,$ monitor只適用於非常簡單的情況,應該使用$ display或$ strobe來代替。