将模块的结果值重新分配给 Verilog 中的一个端口

问题描述

我花了很多时间在 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