Vivado中模块例化为何会影响output reg的值?
为什么Vivado中模块例化会影响output reg的值?
相关代码
被例化模块代码
module second_module( input [7:0] d, output reg [7:0] q ); initial q <= ~d; endmodule
顶层模块代码
module top_module( input [7:0] d, input [1:0] sel, output reg [7:0] q ); wire [7:0] w1,w2,w3; assign sel=1; assign w1=7'd0; assign d=7'd1; initial begin case (sel) 0: q = d; 1: q = w1; 2: q = w2; 3: q = w3; endcase $display("%b",q); end second_module u1(//remark later .d (d), .q (w1) ); endmodule
运行现象
- 保留模块例化时,仿真输出为:
xxxxxxxx - 注释掉模块例化部分后,输出恢复正常:
00000000
问题分析
1. 核心原因:w1的多重驱动冲突
顶层模块中,w1同时被两个源驱动:
- 连续赋值语句
assign w1=7'd0;直接给w1赋值为0; - 例化的
second_module u1通过输出端口.q(w1)给w1赋值为~d(即~7'd1=8'hfe)。
Verilog中,wire型信号被多个驱动源同时驱动时,会触发线网分辨率规则,最终信号值会变为未知态x。当顶层initial块中case分支选中sel=1时,q被赋值为w1的未知态,因此输出xxxxxxxx。
2. 注释例化后的正常逻辑
注释掉second_module u1后,w1仅由assign w1=7'd0;单一驱动源控制,值确定为0,因此q被赋值为0,输出00000000。
3. 额外编码问题
顶层模块中对输入端口d、sel使用assign赋值属于不良习惯:输入端口应由外部激励驱动,内部连续赋值会导致输入端口被多重驱动,虽然未直接引发本次输出问题,但在综合或复杂仿真中可能引发其他异常。
内容的提问来源于stack exchange,提问作者kittygirl
相关产品推荐
相关产品推荐

