我有一个家庭作业问题,我应该为单精度IEEE-754浮点乘法创建一个模块。这是模块:
module prob3(a, b, s);
input [31:0] a, b; // operands
output reg [31:0] s; // sum - Could potentially use wire instead
integer i; // loop variable
reg [8:0] temp;
reg [47:0] intProd; // intermediate product
reg [23:0] tempA;
reg [23:0] tempB;
initial begin
//Initialization
for (i = 0; i < 48; i = i + 1) begin
intProd[i] = 0;
end
//Compute the sign for the result
if (a[31]^b[31] == 0) begin
s[31] = 0;
end
else begin
s[31] = 1;
end
//Compute the exponent for the result
#10 temp = a[30:23] + b[30:23] - 8'b11111111;
//Case for overflow
if(temp > 8'b11111110) begin
s[30:23] = 8'b11111111;
for (i = 0; i < 23; i = i + 1) begin
s[i] = 0;
end
$finish;
end
//Case for underflow
else if (temp < 8'b00000001) begin
for (i = 0; i < 31; i = i + 1) begin
s[i] = 0;
end
$finish;
end
else begin
s[30:23] = temp[7:0];
end
//Mutliply the signficands
//Make implicit one explicit
tempA[23] = 1;
tempB[23] = 1;
//Make operands 24 bits
for(i = 0; i < 23; i = i + 1) begin
tempA[i] = a[i];
tempB[i] = b[i];
end
//Compute product of signficands
intProd = tempA * tempB;
//Check and see if we need to normalize
if(intProd[47:46] >= 2'b10) begin
intProd = intProd >> 1;
temp = s[30:23] + 1'b1;
if(temp > 8'b11111110) begin
s[30:23] = 8'b11111111;
for (i = 0; i < 23; i = i + 1) begin
s[i] = 0;
end
$finish;
end
else
s[30:23] = temp[7:0];
end
s[22:0] = intProd[47:25];
end
endmodule
这是我的测试平台:
module prob4;
reg [31:0] a, b;
wire [31:0] s;
// instantiate the floating point multiplier
prob3 f1(a, b, s);
initial begin
assign a = 32'h42055555;
assign b = 32'hBDCCCCCD;
#10 $monitor("s = %h", s);
assign a = 32'hBF555555;
assign b = 32'hCAB71B00;
#10 $monitor("s = %h", s);
a = 32'hFF500000;
b = 32'h7E700000;
#10 $display("s = %b", s);
a = 32'h01700000;
b = 32'h02F00000;
#10 $display("s = %b", s);
a = 32'hBE000000;
b = 32'h455F36DB;
#10 $display("s = %b", s);
a = 32'h3C800000;
b = 32'h3A800000;
#10 $display("s = %b", s);
a = 32'hC797E880;
b = 32'hB7FBA927;
#10 $display("s = %b", s);
end
endmodule
它显示s的第一个值,但就是这样。老实说我对Verilog并不太熟悉,所以对于为什么会发生这种情况的任何澄清都会非常感激。
答案 0 :(得分:1)
您只看到s
的单个值的原因是因为所有浮点逻辑(prob3
模块中的所有内容)都在初始块内。因此,您只运行一次该代码;它从0开始,暂停10个单位并结束;永远不要再跑了。以下是实现单元的一些技巧(假设模块可以合成而不仅仅是功能验证模型):
将组合逻辑放在always @(*)
块中,而不是初始块。
如上所述,只需调用$monitor
一次,只要s
或作为参数给出的任何其他变量发生变化,它就会通知您;因此,您不需要$display
语句,除非您想知道s
在该执行点的值(无论是否更改并与进程内联,因此不一定是最终值) )。因此,通常您的测试平台主刺激初始块将$monitor()
作为第一行。
不要在逻辑中调用$finish
;理想情况下,您应该设置一个错误信号,而不是如果它看到错误信号被断言,那么测试平台可能会选择调用$finish
。
不要在程序块内部使用assign(always,initial等),只需说a = ...
而不是assign a = ...