Verilog注册/线路混淆

Verilog注册/线路混淆,verilog,logical-operators,cpu-registers,Verilog,Logical Operators,Cpu Registers,我正在用Verilog制作一个多周期CPU,它由一个数据路径和一个控件组成。控制(状态机)的输出是寄存器,但数据路径之间的连接是导线。如果线信号应该是(在psuedo代码中):wire=或(来自mux的线,从控制输出的reg),我该怎么做?你能在Verilog中使用一个带有reg的命令或电线吗?如果没有,是否有更好的方法来实现这一点?控制信号输出是否可以是控制模块中的寄存器,而不是顶部模块中的导线 更新图片以澄清: 是的,您可以在Verilog中使用一个或多个导线和一个reg输出 是的,每个子模

我正在用Verilog制作一个多周期CPU,它由一个数据路径和一个控件组成。控制(状态机)的输出是寄存器,但数据路径之间的连接是导线。如果线信号应该是(在psuedo代码中):
wire=或(来自mux的线,从控制输出的reg)
,我该怎么做?你能在Verilog中使用一个带有reg的命令或电线吗?如果没有,是否有更好的方法来实现这一点?控制信号输出是否可以是控制模块中的寄存器,而不是顶部模块中的导线

更新图片以澄清:

是的,您可以在Verilog中使用一个或多个导线和一个reg输出

是的,每个子模块的输出(本质上是导线)可以直接或间接地在内部连接到子模块内的reg

我认为这是一个很好的方法

现在,您甚至可以将模块的输出声明为“reg”,但这只是在分别声明输出和reg的基础上添加了语义糖分。我更喜欢显式方式(即q1_o和q1_reg)

模块子模块(输入时钟i、输入数据i、输出q1\u o、输出寄存器q2\u o);
reg q1_reg;
始终@(posedge clk_i)开始

q1_reg是的,您可以在Verilog中使用或使用导线和reg输出

是的,每个子模块的输出(本质上是导线)可以直接或间接地在内部连接到子模块内的reg

我认为这是一个很好的方法

现在,您甚至可以将模块的输出声明为“reg”,但这只是在分别声明输出和reg的基础上添加了语义糖分。我更喜欢显式方式(即q1_o和q1_reg)

模块子模块(输入时钟i、输入数据i、输出q1\u o、输出寄存器q2\u o);
reg q1_reg;
始终@(posedge clk_i)开始

q1_reg好的,谢谢,我更新了一张图片只是为了确保。仅供参考:示例只是概念性的。我认为语法是正确的,这是我的想法,我没有访问Verilog编译器来检查。它应该足够近,可以看到REG如何连接到电线上。好的,谢谢,我更新了一张图片以确保。仅供参考:示例只是概念性的。我认为语法是正确的,这是我的想法,我没有访问Verilog编译器来检查。它应该足够近,可以看到regs如何连接到电线上。
module Submod(input clk_i, intput d_i, output q1_o, output reg q2_o);
    reg q1_reg;
    always @(posedge clk_i) begin
        q1_reg <= d_i;
        q2_o <= ~d_i;
    end
    assign q1_o = q1_reg;
endmodule

module Main(input clk_i, input [3:0]ext_i, output [1:0]ext_o)
    wire mux, x1, x2;

    Submod Submod_inst(clk_i, ext_i[0], x1, x2);

    assign ext_o[0] = x1;
    assign mux = ext_i[1] ? ext_i[2] : ext_i[3];

    assign ext_o[1] = mux | x2; /* something like this */
endmodule