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

相关阅读

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.mzph.cn/news/148358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超聚变服务器关闭超线程CPU的步骤(完整版)

前言: 笨鸟先飞&#xff0c;好记性不如烂笔头。 我们项目都用不到超线程CPU&#xff0c;所以调测设备的时候都需要关掉&#xff0c;最近新设备换成了超聚变的服务器&#xff0c;这篇记录我关闭&#xff08;超聚变&#xff09;服务器超线程CPU的方法步骤。 关闭超线程CPU的步骤…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

基于单片机音乐弹奏播放DS1302万年历显示及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302计时显示年月日时分秒。 3、按键可以弹奏以及播放音乐&#xff0c;内置16首音乐。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /时钟显示**/ void init_1602_ds1302() { write…

机器学习-搜索技术:从技术发展到应用实战的全面指南

在本文中&#xff0c;我们全面探讨了人工智能中搜索技术的发展&#xff0c;从基础算法如DFS和BFS&#xff0c;到高级搜索技术如CSP和优化问题的解决方案&#xff0c;进而探索了机器学习与搜索的融合&#xff0c;最后展望了未来的趋势和挑战&#xff0c;提供了对AI搜索技术深刻的…

Lesson 04 模板入门

C&#xff1a;渴望力量吗&#xff0c;少年&#xff1f; 文章目录 一、泛型编程1. 引入2. 函数模板&#xff08;1&#xff09;函数模板概念&#xff08;2&#xff09;函数模板格式&#xff08;3&#xff09;函数模板的原理&#xff08;4&#xff09;函数模板的实例化&#xff08…

uniapp优化h5项目-摇树优化,gzip压缩和删除console.log

1.摇树优化 勾选摇树优化,打包删除死代码 2.gzip压缩和删除console.log 安装插件webpack和compression-webpack-plugin webpack插件 npm install webpack4.46.0 --save-devcompression-webpack-plugin插件 npm install compression-webpack-plugin6.1.1 --save-devconst Com…

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰

说明 本文作为PMCW体制雷达系列文章之一&#xff0c;主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域&#xff0c;对于一切以电磁波作为媒介的信息传递活动&#xff0c;干扰是无处不在的。近年来&#xff0c;随着雷达装车率的提高&#xff0c;…

HTTP Error 500.31 - Failed to load ASP.NET Core runtime

在winserver服务器上部署net6应用后&#xff0c;访问接口得到以下提示&#xff1a; 原因是因为没有安装net6的运行时和环境&#xff0c;我们可以在windows自带的 “事件查看器” 查看原因。 可以直接根据给出的地址去官网下载sdk环境&#xff0c;安装即可 下载对应的net版本…

CentOS Linux release 7.9.2009 (Core)中安装配置Tomcat

一、安装JDK 部分内容可以参考我这篇文章&#xff1a;Windows11与CentOS7下配置与检测JDK与Maven环境变量 中的 2.2 安装jdk-8u371-linux-x64.tar.gz和配置环境变量/etc/profile //1、安装redhat-lsb yum install -y redhat-lsb//2、查看系统版本信息 lsb_release -a //3、查…

【C++入门】拷贝构造运算符重载

目录 1. 拷贝构造函数 1.1 概念 1.2 特征 1.3 常用场景 2. 赋值运算符重载 2.1 运算符重载 2.2 特征 2.3 赋值运算符 前言 拷贝构造和运算符重载是面向对象编程中至关重要的部分&#xff0c;它们C编程中的一个核心领域&#xff0c;本期我详细的介绍拷贝构造和运算符重载。 1. …

Transformer中WordPiece/BPE等不同编码方式详解以及优缺点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

FPGA设计时序约束八、others类约束之Set_Case_Analysis

目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时序…

uniapp 微信小程序登录 新手专用 引入即可

预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…

05-Spring Boot工程中简化开发的方式Lombok和dev-tools

简化开发的方式Lombok和dev-tools Lombok常用注解 Lombok用标签方式代替构造器、getter/setter、toString()等重复代码, 在程序编译的时候自动生成这些代码 注解名功能NoArgsConstructor生成无参构造方法AllArgsConstructor生产含所有属性的有参构造方法,如果不希望含所有属…

[C/C++]数据结构 栈和队列()

一:栈 1.1 栈的概念及结构 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守先进后出的原则. 压栈:栈的插入操作叫做进栈/压栈/入栈,将数据插入栈顶 出栈:栈的删除操作也叫出…

Redis新操作

1.Bitmaps 1.1概述 Bitmaps可以对位进行操作&#xff0c;实际上它就是一个字符串&#xff0c;可以将Bitmaps想象为一个以位为单位的数组&#xff0c;数组中的每个元素只能存储0或者1&#xff0c;数组的下标在Bitmaps被称为偏移量。 setbit key offset value&#xff1a;设置o…

MIB 6.S081 System calls(1)using gdb

难度:easy In many cases, print statements will be sufficient to debug your kernel, but sometimes being able to single step through some assembly code or inspecting the variables on the stack is helpful. To learn more about how to run GDB and the common iss…

十二.Jenkins持续集成

十二.Jenkins持续集成 一.安装jenkins 1.下载 Jenkins下载地址&#xff1a;http://jenkins-ci.org/ 或 https://mirrors.jenkins-ci.org/redhat/2.安装 可以通过官网的安装方式来安装 安装完后&#xff0c;需要修改以下的配置 vim /usr/lib/systemd/system/jenkins.servic…

git常用命令和参数有哪些?【git看这一篇就够了】

文章目录 前言常用命令有哪些git速查表奉上常用参数后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;git操作相关 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出…

Git企业开发级讲解(五)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、bug 分⽀二、删除临时分支三、小结 一、bug 分⽀ 假如我们现在正在 dev2 分⽀上进⾏开发…