使用条件(?:) assign语句连接模块

时间:2013-11-04 18:37:22

标签: verilog

我试图根据bit_proc_rw信号值以不同方式连接2个模块。 无法发布图片,所以:

如果bit_proc_rw数据流:bit_in - > SCR - > CRC - > bit_out

如果没有,它是一个接收者:bit_in - > CRC - > SCR - > bit_out

所以我在一个顶级模块(所有线型)中做到了这一点:

assign SCR_input = (bit_proc_rw) ?  bit_proc_in : CRC_output; 
assign SCR_input_dav = (bit_proc_rw) ? bit_proc_in_dav : CRC_output_dav;

assign SCR_output = (bit_proc_rw) ? CRC_input : bit_proc_out;
assign SCR_output_dav = (bit_proc_rw) ? CRC_input_dav : bit_proc_out_dav;

assign CRC_input = (bit_proc_rw) ?  SCR_output : bit_proc_in; 
assign CRC_input_dav = (bit_proc_rw) ? SCR_output_dav : bit_proc_in_dav;

assign CRC_output = (bit_proc_rw) ? bit_proc_out : SCR_input;
assign CRC_output_dav = (bit_proc_rw) ? bit_proc_out_dav : SCR_input_dav;


crc_gen crc_gen_u (
.clk (clk),
.crc_in (CRC_input),
.crc_in_dav (CRC_input_dav),
.crc_out (CRC_output),
.crc_out_dav (CRC_output_dav),
.bit_proc_rw (bit_proc_rw),

);

scr scr_u (
.clk (clk),
.scr_in (SCR_input),
.scr_in_dav (SCR_input_dav),
.scr_out (SCR_output),
.scr_out_dav (SCR_output_dav),
.bit_proc_rw (bit_proc_rw)
);

Testbench显示仅驱动输入(例如,rw = 0 CRC输入有效,但其余值未知)。 是因为我同时将输入和输出都分配给输入? 或者这是正确的,我应该在我的代码中寻找错误? 如果没有,如何仅使用每个模块的一个实例来做到这一点?

希望我把一切都弄清楚,谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

条件运算符(?:)是2:1单向多路复用器。 assign语句也是单向的。因此,分配会在匹配*_output*的信号上添加其他驱动程序。多个冲突的驱动程序值是未知值的原因。要更正错误,请删除输出的分配,并使用多路复用器将多路复用器分配给bit_proc_out*

/* Remove / comment out:
 * assign SCR_output = (bit_proc_rw) ? CRC_input : bit_proc_out;
 * assign SCR_output_dav = (bit_proc_rw) ? CRC_input_dav : bit_proc_out_dav;
 *
 * assign CRC_output = (bit_proc_rw) ? bit_proc_out : SCR_input;
 * assign CRC_output_dav = (bit_proc_rw) ? bit_proc_out_dav : SCR_input_dav;
 */

// Add
assign bit_proc_out = (bit_proc_rw) ? CRC_output : SCR_output;
assign bit_proc_out_dav = (bit_proc_rw) ? CRC_output_dav : SCR_output_dav;