问题描述
我花了很多时间在 Verilog 中实现算法。我必须使用浮点数,因此 FPU 模块用于计算所有运算结果(+、-、*、/)。 FPU 模块实例化,out 是操作数 (fpu_op) 应用于 opa 和 opb 的结果,都是 32 位 reg s,表示 IEEE754 浮点数:
fpu inst0 (.clk(clk),.rmode(rmode),.fpu_op(fpu_op),.opa(opa),.opb(opb),.out(fout));
我想知道是否可以像下面的代码那样在 always 块中重新分配值: (rcmp_1 是也在模块中进行的浮点比较的结果)
always @ (posedge clk) begin
if(rcmp_1[0] & !rcmp_1[1]) begin
opa <= x;
opb <= ftwo;
fpu_op <= mul;
x <= fout;
end
end
所以我的问题是:在 if 块的末尾 x 是否包含 fout 的值,我可以进一步在其他 always 块中使用 x 的计算值吗? 任何帮助表示赞赏。谢谢!
解决方法
您的 always 模块对一组 4 个寄存器(无复位)进行建模,这些寄存器由 rcmp_1 等于“01”的条件启用。 当条件为真时,在时钟的上升沿,名为 opa、opb、fpu_op 和 x 的四个寄存器的输出变为等于: opa 等于 x 的实际值 opb 等于 ftwo, fpu_op 等于 mul, x 的下一个值变为等于 fout。 所以在我看来,你的第一个问题的答案是肯定的。
同样,您可以在其他 always 块(电路)中使用 x(将寄存器的输出与输出“x”连接起来)。第二个问题也是。
我会把你的代码写成:
assign enable = (rcmp_1==2'b01); // enable signal on 1bit
always @ (posedge clk) // register for fpu_op
begin
if(enable) fpu_op <= mul;
end
always @ (posedge clk) // register for x
begin
if(enable) x <= fout;
end
always @ (posedge clk) // register for opa
begin
if(enable) opa <= x;
end
always @ (posedge clk) // register for opb
begin
if(enable) opb <= ftwo;
end