Module 将模块的结果值重新分配给其中一个';Verilog中的s端口

Module 将模块的结果值重新分配给其中一个';Verilog中的s端口,module,verilog,sequential,Module,Verilog,Sequential,我花了很多时间在Verilog中实现一个算法。我必须使用浮点数,所以FPU模块用于计算所有运算结果(+、-、*、/)。FPU模块实例化,out是opa和opb上应用的操作数(FPU_op)的结果,这两个32位寄存器都表示IEEE754浮点数: fpu inst0 (.clk(clk), .rmode(rmode), .fpu_op(fpu_op), .opa(opa), .opb(opb), .out(fout)); 我想知道在always块中重新赋值是否可以,如下代码所示: (rcmp_1

我花了很多时间在Verilog中实现一个算法。我必须使用浮点数,所以FPU模块用于计算所有运算结果(+、-、*、/)。FPU模块实例化,out是opa和opb上应用的操作数(FPU_op)的结果,这两个32位寄存器都表示IEEE754浮点数:

fpu  inst0 (.clk(clk), .rmode(rmode), .fpu_op(fpu_op), .opa(opa), .opb(opb), .out(fout));
我想知道在always块中重新赋值是否可以,如下代码所示: (rcmp_1是模块中浮子比较的结果)

始终@(posedge clk)开始
如果(rcmp_1[0]&!rcmp_1[1])开始

opa您的always block为一组4个寄存器建模(无复位),这些寄存器由等于“01”的条件rcmp_1启用。 当该条件为真时,在时钟上升沿,四个寄存器的输出,即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


分配启用=(rcmp_1==2'b01);//1bit上的启用信号
始终@(posedge clk)//为fpu\U op注册
开始

如果(启用)fpu_op,则取决于声明。所有lhs VAR都应该是寄存器。这假设rcmp_1的声明是
[1:0]
。你为什么用这种方式重写模型?原因是什么?此外,fpu_op、opa、opb和“x”必须是寄存器。>>这假设rcmp_1的声明为[1:0]。是>>fpu_op、opa、opb和“x”也必须是寄存器。是>>为什么要以这种方式重写模型?如果将代码与实际电路关联(一个输出与一个块关联),则更容易理解。启用信号的声明简化了合成器的工作,合成器知道所有寄存器都需要相同的信号。您可能应该在答案中添加声明要求,因为OP没有提供这些要求。关于合成器的其余部分是值得怀疑的。您的样式对SynthCapture没有帮助,需要更多的键入,但在某些情况下可能会有所帮助。使用它是个人喜好的问题。

    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