Verilog中的ALU,模拟时缺少输出
An ALU in Verilog, lack of output while simulating
我用verilog写了一个简单的ALU是这样的:
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
我预测的答案对吗?或者是什么问题导致了这种情况?
$monitor
每次其参数值发生变化时都会显示其参数值。你怎么能期待两行20
?
$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。
我用verilog写了一个简单的ALU是这样的:
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
我预测的答案对吗?或者是什么问题导致了这种情况?
$monitor
每次其参数值发生变化时都会显示其参数值。你怎么能期待两行20
?
$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。