我创建了两个不同的Verilog模块(shiftByImm
和immShifter
)。我想要做的是只选择其中一个的输出作为我正在创建的这个小多路复用器模块的输出。
module superShifter(input [0:31] in, input select, input [0:4] shift_value, input[0:1] shift, output reg [0:31] out);
shiftByImm shift0(in, shift_value, shift, out);
immShifter shift1(in, shift_value, out);
assign {out} = select == 1'b0 ? shift0 : shift1;
endmodule
然而,这给了我两个完全可以理解的错误:
非法引用接口" shift0"
and
非法引用接口" shift1"
我知道这里缺少一些东西。如何选择SuperShifter
模块的输出与其中一个预制模块的输出相同?
答案 0 :(得分:3)
您的问题在于您的命名约定。你有2个模块(我猜测)有两个不同的输出,但你给他们相同的名字。在此示例中,您使用的是端口顺序方法。括号中的名称通过顺序隐式关联,并且不需要与实例化中的名称相同。另一种方法是按名称连接端口。在示例中,我展示了两种方法。从那时起,您将不得不使用声明的导线来选择带有" little mux"的输出。
module superShifter(input [0:31] in, input select, input [0:4] shift_value, input[0:1] shift, output reg [0:31] out);
wire [0:31] temp_out_0;
wire [0:31] temp_out_1;
shiftByImm shift0(in, shift_value, shift, temp_out_0);
immShifter shift1(.in(in), .shift_value(shift_value), .out(temp_out_1));
assign {out} = select == 1'b0 ? temp_out_0 : temp_out_1;
endmodule
答案 1 :(得分:1)
来自@ N8TROs回答看起来你正试图打电话给#39;模块并让它们生成输出。
模块不等同于在需要时调用的任务,它们代表硬件的物理块。多路复用器需要选择您想要的模块输出。
由于您有两个模块驱动相同的输出,您可能会看到x
s当一个模块驱动1而另一个模块驱动时,电线或网络最终会发生冲突。
我真的同意N8TRO建议使用ANSI样式的命名端口,这真的是支持调试和代码维护。
但为了简洁起见,看到代码中的最小变化才能使其正常工作:
shiftByImm shift0(in, shift_value, shift, out0); //<-- Unique output
immShifter shift1(in, shift_value, out1); //<-- Unique output
assign {out} = select == 1'b0 ? out0: out1; //<-- select output