Verilog:选择两个实例之一作为输出

Posted

技术标签:

【中文标题】Verilog:选择两个实例之一作为输出【英文标题】:Verilog: Select one of two instances as the Output 【发布时间】:2014-03-18 04:42:57 【问题描述】:

我创建了两个不同的 Verilog 模块(shiftByImmimmShifter)。我要做的是只选择两者之一的输出作为我正在创建的这个小多路复用器模块的输出。

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 模块的输出与预制模块之一的输出相同?

【问题讨论】:

【参考方案1】:

您的问题在于您的命名约定。您有 2 个具有 2 个不同输出的模块(我猜),但您给它们取了相同的名称。在此示例中,您使用的是端口排序方法。括号中的名称按顺序隐式关联,不需要与它们在实例化中的名称相同。另一种方法是按名称连接端口。在示例中,我展示了这两种方法。从那时起,您将不得不使用声明的电线来选择带有“小多路复用器”的输出。

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

【讨论】:

【参考方案2】:

根据@N8TROs 的回答,您似乎正在尝试“调用”模块并让它们生成输出。

模块不等同于在需要时调用的任务,它们代表硬件的物理块。多路复用器需要选择您想要的输出,而不是您希望激活的模块。

由于两个模块驱动相同的输出,您可能会看到xs 当一个模块驱动 1 而另一个驱动 0 时,电线或网络将最终发生冲突。

我非常同意 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

【讨论】:

以上是关于Verilog:选择两个实例之一作为输出的主要内容,如果未能解决你的问题,请参考以下文章

verilog 中顶层模块实例引用多个模块时端口怎么连接

verilog 中顶层模块实例引用多个模块时端口怎么连接

Verilator 可以创建类层次结构吗?

如何编辑和测试verilog网表

使用 Verilator 和 VPI 读取 regs 数组

verilog中多次调用一个module实例