子模块之间的连接错误
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));
我的 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));