Verilog基础:仿真时x信号的产生和x信号对于各运算符的特性

news/2024/11/25 23:35:49/

相关阅读

Verilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.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 = 1'b0;
assign a = 1'b1; //赋值冲突,所以a的值为x//一个依旧很幼稚的例子
initial beginb = 1'b0;c = 1'b1;
endassign a = b;
assign a = c; //同样是赋值冲突,所以a的值为x//一个复杂一点的例子
wire  a;
reg b, c;
initial beginb = 1'b0;c = 1'b0;#5 c = 1'b1;#5 c = 1'b0;#5 c = 1'b1;#5 c = 1'b0;
endassign a = b;
assign a = c; //因为有时冲突,有时不冲突,所以a的值交替为0和x,最后为0//一个迷惑一点的例子
wire  a;
reg b, c;
initial beginb = 1'b0;c = 1'b0;#25;#5 c = 1'b1;#5 c = 1'b0;#5 c = 1'b1;#5 c = 1'b0;
endassign a = b;
assign #20 a  = c; //因为连续赋值有延迟,而25ns后每次c改变的脉冲都小于20ns,所以没有进行赋值,最后的c值为0,因此a的值一直是0

        有些运算也可能会产生x信号,下面简单介绍,但需要注意的是,他们大多只是x信号的传播者,而不是x信号的制造者。

算数操作符+、-、*、/、%、**

        对于算术运算符,当操作符的操作数中出现了x时,无论原本结果是否可能全部或部分确认,结果全为x值。

a = 3'b001;
b = 3'bx01;    
$display("result is %b",a+b);//结果为xxxa = 3'bx01;
b = 3'b000;    
$display("result is %b",a*b);//结果为xxx

比较运算符<、<=、>、>=、===、!==、==、!=

        对于<、<=、>、>=、==、!=,它们的比较结果是0或1,但是如果操作数中存在x,比较结果为x。

        对于===、!==,它们严格比较两个操作数中的x,因此结果只能为0或1。。

b = 3'b111;
c = 3'b0x1;    
$display("result is %b",b<c);//结果为xb = 3'b0x1;
c = 3'b0x1;    
$display("result is %b",b===c);//结果为1

逻辑操作符&&、||、!

        逻辑运算符的运算结果为0或1,但是如果操作数中存在x,结果为x。

b = 3'b0x1;
c = 3'b001;    
$display("result is %b",b&&c);//结果为xc = 3'b0x1;    
$display("result is %b",!c);//结果为x

位运算操作符&、|、^、~^、~

        位运算符按位对操作数进行操作,注意对于这些运算符,某位的x不会影响其他非x位的结果。且x与1为x,x与0为0,x或1为1,x或0为x。对于异或、同或和取反运算,x位的结果是x。

b = 3'b0x1;
c = 3'bx11;    
$display("result is %b",b&c);//结果为0x1b = 3'b0x1;
c = 3'bx11;    
$display("result is %b",b^c);//结果为xx0

规约运算符&、|、^、~&、~&、~^

        规约运算符的运算结果为0或1,对于&,如果操作数中存在0,结果为0(不管是否含有x),对于|,如果操作数中存在1,结果为1(不管是否含有x)。其他情况下,如果操作数中有x,结果为x。

b = 3'bx10;    
$display("result is %b",|b);//结果为1b = 3'bx10;    
$display("result is %b",&b);//结果为0b = 3'bx10;    
$display("result is %b",^b);//结果为x

移位操作符<<、>>、<<<、>>>

        <<、>>为逻辑移位,即补0移位。而<<<、>>>为算数移位,对于有符号的操作数,算数右移>>>时会在左边补符号位(最高位),其他情况下,算数移位和逻辑移位效果一样。

        当移位操作符的右操作数中有x时,结果为x。

b = 3'b1x1;   $display("result is %b",b>>1'bx);//结果为xxxb = 3'b1x1;   $display("result is %b",b<<1);//结果为x10signed reg b;
b = 3'bx01;   $display("result is %b",b>>>1);//结果为xx0

条件运算符?:

        当条件中因为有x无法确定是否为0时,结果会含有x,但不一定全是x。对于这一点,感兴趣的可以看往期文章,有关于表达式位宽和符号拓展的讨论。

b = 3'b0x;   
$display("result is %b",b?2'sb1:2'sb0);//结果为xxb = 3'b1x;   
$display("result is %b",b?1'sb1:2'sb0);//结果为11(符号拓展)b = 3'b0x;   
$display("result is %b",b?2'b1:2'b0);//结果为0x(补零拓展)

连接运算符{}

        对于连接运算符,某一位的x不会影响其他位。

$display("result is %b",{1'bx,3'b111});//结果为x111

向量的位选、域选

         当位选超出界限时,会返回x。当域选超出界限时,超出的部分会用x填充。当数组索引超出界限时,结果全为x。

b = 3'b111;   
$display("result is %b",b[3]);//结果为xb = 3'b111;   
$display("result is %b",b[4:2]);//结果为xx1reg [2:0] c [1:0]
c[0] = 3'b000;
c[1] = 3'b111;
$display("result is %b",c[2]]);//结果为xxx


http://www.ppmy.cn/news/1228956.html

相关文章

Docker基础知识总结

文章目录 1.Docker介绍2.Docker版本3.为什么要使用Docker4.Docker基础组件4.1 镜像&#xff08;Images&#xff09;4.2 容器&#xff08;Container&#xff09;和仓库&#xff08;Repository&#xff09; 5.Docker安装6.Docker run7.Dockerfile8.Docker commit9.镜像发布到镜像…

C++不同类型转换

内置类型的转换&#xff1a; 内置类型之间的转换之前提过。相同类型的赋值直接进行&#xff0c;但不同类型之间的赋值系统会将将其转换成临时变量&#xff0c;这个临时变量具有常性&#xff0c;然后再将这个临时变量进行赋值&#xff0c;这里就不做代码演示了。自定义类型转换为…

【C#】字符串拼接相关

目录 1.字符串拼接方式1 用号进行字符串拼接 复合运算符 2.字符串拼接方式2 3.控制台打印拼 4.例子 1.字符串拼接方式1 之前的算数运算符 只是用来数值类型变量进行数学运算的而 string 不存在算数运算符 不能计算 但是可以通过号来进行字符串拼接 用号进行字符串拼接 …

不想花大价钱?这10款替代Axure的平替软件更划算!

Axure是许多产品经理和设计师进入快速原型设计的首选工具&#xff0c;但Axure的使用成本相对较高&#xff0c;学习曲线陡峭&#xff0c;许多设计师正在寻找可以取代Axure的原型设计工具&#xff0c;虽然现在有很多可选的设计工具&#xff0c;但质量不均匀&#xff0c;可以取代A…

1.1二分查找

二分查找&#xff0c;主要是针对基本有序的数据来进行查找target。 二分法的思想很简单&#xff0c;因为整个数组是有序的&#xff0c;数组默认是递增的。 1.1 使用条件 用于查找的内容逻辑上来说是需要有序的查找的数量只能是一个&#xff0c;而不是多个 1.2 简介 首先选…

详解使用asyncio实现playwright并发操作(复制源码即可运行)

asyncio实现并发 我们可以使用asyncio来解决palywright中并发的问题&#xff0c;asyncio即Asynchronous I/O是python一个用来处理并发(concurrent)事件的包&#xff0c;是很多python异步架构的基础&#xff0c;多用于处理高并发网络请求方面的问题。给大家举一个经典的应用场景…

C#入门(6): 结构体、ref struct

文章目录 定义结构体实例化结构体结构体的值类型特性结构体和类的区别限制ref structref return C# 中的结构体&#xff08;Struct&#xff09;是一种值类型数据结构&#xff0c;用于封装不同或相同类型的数据成一个单一的实体。结构体非常适合用来表示轻量级的对象&#xff0c…

(八)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (检索 Retrieval)

检索增强生成&#xff08;RAG&#xff09;的整体工作流程如下&#xff1a; 在构建检索增强生成 (RAG) 系统时&#xff0c;信息检索是核心环节。检索是指根据用户的问题去向量数据库中搜索与问题相关的文档内容&#xff0c;当我们访问和查询向量数据库时可能会运用到如下几种技术…