子模块之间的连接错误

Connections between sub modules wrong

我的 Alu 和 Mux 代码:

module alu(input logic [31:0]srca, srcb,
          input logic [2:0] alucontrol,
          output logic zero,
          output logic [31:0]aluout);

logic [31:0] addr, subr, sltr, Andr, Orr;
assign addr = srca + srcb;
assign subr = srca - srcb;
assign sltr = (srca < srcb) ? 1 : 0;
assign Andr = srca & srcb;
assign Orr = srca | srcb;
always_comb 
begin
case(alucontrol)
    3'b010: aluout = addr;
    3'b110: aluout = subr;
    3'b111: aluout = sltr;
    3'b000: aluout = Andr;
    3'b001: aluout = Orr;
    default: aluout = 32'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
endcase
zero = (subr == 0) ?  1 : 0;
end
endmodule


module mux2#(parameter WIDTH = 8)
                (input logic [WIDTH-1:0] d0, d1,
                 input logic                 s,
                 output logic [WIDTH-1:0] y);
always_comb
begin
y = s?d1 : d0;
end
endmodule

和它们在同一个顶层模块下的实例化:

alu         alu(srca, srcb, alucontrol, aluout, zero);

mux2 #(32) resmux(aluout, readdata, memtoreg, result);

当我尝试将我的 2-1Mux resmux 与我的 alu 连接时,aluout 没有连接到 resmux

aluout gets suspended

我可以通过交换 aluout 和零的顺序来解决这个问题,但是谁能解释为什么会发生这种情况以及如何避免?非常感谢!

SystemVerilog 中有多种连接端口的机制。您使用的机制是 positional。这意味着每个信号连接都必须按照它们在 alu 的模块声明中出现的规定顺序进行。按照您编写代码的方式,模块 top 中的信号 zero 连接到模块 alu.

中声明的最后一个端口 aluout

SystemVerilog 也有一个 by_name 语法 .portname(signal)。您可以按任何顺序列出所有端口连接。

alu   alu(.srca(srca), .srcb(srcb), .alucontrol(alucontrol), .alu(aluout), .zero(zero));

当您连接的信号名称与声明的端口名称匹配时,您可以直接使用.portname

alu alu(.alucontrol, .aluout, .zero, .srca, .srcb);

最后,如果所有端口名称都与信号名称相匹配,您可以使用通配符,.* 以及明确列出例外情况

alu alu(.*, .zero(my_zero));