做模型网站赚钱么,昆明app网站开发公司,全网营销销售,云南新建设国际小学网站相关阅读
Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 信号爆x也许是所有IC人的噩梦#xff0c;满屏的红色波形常让人头疼不已#xff0c;但x信号的产生原因却常常只有几种#xff0c;只要遵循一定的代码规范#…相关阅读
Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 信号爆x也许是所有IC人的噩梦满屏的红色波形常让人头疼不已但x信号的产生原因却常常只有几种只要遵循一定的代码规范就可以避免产生信号中出现x的问题。 最常见问题就是使用了未初始化的reg型变量因为reg型变量在被创建后使用默认值x。如果在初始化变量之前在其他地方提前使用了便有可能造成x态的传播。为了避免可以给所有时序逻辑中用到的reg型变量赋初值不可综合但更为推荐的是为所有时序逻辑中使用到的reg型变量添加复位逻辑可综合并确保复位如下所示。对于组合逻辑中使用到的reg型变量只需要确保始终有正确的驱动即可。
reg a 0;reg b;always(posedge clk, negedge rst_n)beginif(rst_n)b 0;elseb ***;
end 连续赋值语句也可能会导致x信号的产生在连续赋值语句对wire型线网赋值时如果出现了多个驱动源同时驱动为不同的值除z外因为z看做没有驱动时会显示为不定态直到多个驱动不冲突如下所示。
//一个很幼稚的例子
assign a 1b0;
assign a 1b1; //赋值冲突所以a的值为x//一个依旧很幼稚的例子
initial beginb 1b0;c 1b1;
endassign a b;
assign a c; //同样是赋值冲突所以a的值为x//一个复杂一点的例子
wire a;
reg b, c;
initial beginb 1b0;c 1b0;#5 c 1b1;#5 c 1b0;#5 c 1b1;#5 c 1b0;
endassign a b;
assign a c; //因为有时冲突有时不冲突所以a的值交替为0和x最后为0//一个迷惑一点的例子
wire a;
reg b, c;
initial beginb 1b0;c 1b0;#25;#5 c 1b1;#5 c 1b0;#5 c 1b1;#5 c 1b0;
endassign a b;
assign #20 a c; //因为连续赋值有延迟而25ns后每次c改变的脉冲都小于20ns所以没有进行赋值最后的c值为0因此a的值一直是0 有些运算也可能会产生x信号下面简单介绍但需要注意的是他们大多只是x信号的传播者而不是x信号的制造者。
算数操作符、-、*、/、%、** 对于算术运算符当操作符的操作数中出现了x时无论原本结果是否可能全部或部分确认结果全为x值。
a 3b001;
b 3bx01;
$display(result is %b,ab);//结果为xxxa 3bx01;
b 3b000;
$display(result is %b,a*b);//结果为xxx比较运算符、、、、、!、、! 对于、、、、、!它们的比较结果是0或1但是如果操作数中存在x比较结果为x。 对于、!它们严格比较两个操作数中的x因此结果只能为0或1。。
b 3b111;
c 3b0x1;
$display(result is %b,bc);//结果为xb 3b0x1;
c 3b0x1;
$display(result is %b,bc);//结果为1
逻辑操作符、||、! 逻辑运算符的运算结果为0或1但是如果操作数中存在x结果为x。
b 3b0x1;
c 3b001;
$display(result is %b,bc);//结果为xc 3b0x1;
$display(result is %b,!c);//结果为x 位运算操作符、|、^、~^、~ 位运算符按位对操作数进行操作注意对于这些运算符某位的x不会影响其他非x位的结果。且x与1为xx与0为0x或1为1x或0为x。对于异或、同或和取反运算x位的结果是x。
b 3b0x1;
c 3bx11;
$display(result is %b,bc);//结果为0x1b 3b0x1;
c 3bx11;
$display(result is %b,b^c);//结果为xx0 规约运算符、|、^、~、~、~^ 规约运算符的运算结果为0或1对于如果操作数中存在0结果为0不管是否含有x对于|如果操作数中存在1结果为1不管是否含有x。其他情况下如果操作数中有x结果为x。
b 3bx10;
$display(result is %b,|b);//结果为1b 3bx10;
$display(result is %b,b);//结果为0b 3bx10;
$display(result is %b,^b);//结果为x 移位操作符、、、 、为逻辑移位即补0移位。而、为算数移位对于有符号的操作数算数右移时会在左边补符号位最高位其他情况下算数移位和逻辑移位效果一样。 当移位操作符的右操作数中有x时结果为x。
b 3b1x1; $display(result is %b,b1bx);//结果为xxxb 3b1x1; $display(result is %b,b1);//结果为x10signed reg b;
b 3bx01; $display(result is %b,b1);//结果为xx0 条件运算符?: 当条件中因为有x无法确定是否为0时结果会含有x但不一定全是x。对于这一点感兴趣的可以看往期文章有关于表达式位宽和符号拓展的讨论。
b 3b0x;
$display(result is %b,b?2sb1:2sb0);//结果为xxb 3b1x;
$display(result is %b,b?1sb1:2sb0);//结果为11(符号拓展)b 3b0x;
$display(result is %b,b?2b1:2b0);//结果为0x(补零拓展) 连接运算符{} 对于连接运算符某一位的x不会影响其他位。
$display(result is %b,{1bx,3b111});//结果为x111 向量的位选、域选 当位选超出界限时会返回x。当域选超出界限时超出的部分会用x填充。当数组索引超出界限时结果全为x。
b 3b111;
$display(result is %b,b[3]);//结果为xb 3b111;
$display(result is %b,b[4:2]);//结果为xx1reg [2:0] c [1:0]
c[0] 3b000;
c[1] 3b111;
$display(result is %b,c[2]]);//结果为xxx