结构型4x4阵列乘法器Verilog仿真输出出现X未知态如何解决
4x4阵列乘法器未知态X问题排查及解决
问题原因
1. 信号未声明异常
- array_multiplier模块内直接使用了接地信号
a,但未提前声明a的类型,部分仿真器会将未声明信号默认判定为未初始化的X态,即便后续做了assign赋值也可能出现逻辑异常。
2. 多驱动冲突
- 你定义了4位宽的线网
wire[3:0] c2,但实例l22的进位输出和实例l23的进位输出都连接到了c2[3],两个输出端口同时驱动同一个线网,当输出值不一致时就会产生冲突,出现X态。
3. 信号悬空未驱动
- 线网
c2[2]没有被任何模块的输出端口驱动,始终处于高阻态,接入l23的进位输入后会将X态向后传递到prod[5]、prod[6]等后续输出位。 - 第一行运算单元的进位输出
c0[0]、c0[1]、c0[2]全部悬空未连接,也会导致部分场景下的逻辑异常。
解决方法
步骤1:补全信号声明
在array_multiplier模块的线网定义部分补全接地信号的声明:
wire[3:0] c0, c1, c2, c3; wire[3:0] s0, s1, s2; wire a; // 新增接地信号声明 assign a = 1'b0;
步骤2:修正多驱动冲突
修改l22实例的进位输出连接,从c2[3]改为c2[2],补上悬空的c2[2]的驱动:
// 修改前:BB_struct l22 (A[2], B[2], s1[3], c2[1], s2[2], c2[3]); BB_struct l22 (A[2], B[2], s1[3], c2[1], s2[2], c2[2]);
步骤3:修正第一行运算单元的进位连线
将同一行前一个BB的进位输出接到后一个BB的进位输入,避免进位悬空:
BB_struct l00 (A[0], B[0], a, a, prod[0], c0[0]); // l01的进位输入接l00的进位输出 BB_struct l01 (A[1], B[0], a, c0[0], s0[1], c0[1]); // l02的进位输入接l01的进位输出 BB_struct l02 (A[2], B[0], a, c0[1], s0[2], c0[2]); // l03的进位输入接l02的进位输出 BB_struct l03 (A[3], B[0], a, c0[2], s0[3], c0[3]);
所有连线按照4x4阵列乘法器的标准结构核对,确保所有输入线网都有明确驱动、没有多驱动冲突后,重新仿真即可消除X态。
内容的提问来源于stack exchange,提问作者CED19I027 NIMMAGADDA SREE DHYU
相关产品推荐
相关产品推荐

