当前位置: 首页 > news >正文

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

相关阅读

Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


仿真时x信号的产生

信号爆x也许是所有IC人的噩梦,满屏的红色波形常让人头疼不已,但x信号的产生原因却常常只有几种,只要遵循一定的代码规范,就可以避免产生信号中出现x的问题。

最常见问题就是使用了未初始化的reg型变量,因为reg型变量在被创建后使用默认值x。如果在初始化变量之前在其他地方提前使用了,便有可能造成x态的传播。为了避免,可以给所有时序逻辑中用到的reg型变量赋初值(不可综合),但更为推荐的是为所有时序逻辑中使用到的reg型变量添加复位逻辑(可综合)并确保复位,如下所示。对于组合逻辑中使用到的reg型变量,只需要确保始终有正确的驱动即可。

reg a = 0; reg b; always@(posedge clk, negedge rst_n)begin if(rst_n) b <= 0; else b <= ***; end

连续赋值语句也可能会导致x信号的产生,在连续赋值语句对wire型线网赋值时,如果出现了多个驱动源同时驱动为不同的值,并且强度一致(除z外,因为z看做没有驱动)时,会显示为不定态,直到多个驱动不冲突,如下所示。

//一个很幼稚的例子 assign a = 1'b0; assign a = 1'b1; //赋值冲突,所以a的值为x //一个依旧很幼稚的例子 initial begin b = 1'b0; c = 1'b1; end assign a = b; assign a = c; //同样是赋值冲突,所以a的值为x //一个复杂一点的例子 wire a; reg b, c; initial begin b = 1'b0; c = 1'b0; #5 c = 1'b1; #5 c = 1'b0; #5 c = 1'b1; #5 c = 1'b0; end assign a = b; assign a = c; //因为有时冲突,有时不冲突,所以a的值交替为0和x,最后为0 //一个迷惑一点的例子 wire a; reg b, c; initial begin b = 1'b0; c = 1'b0; #25; #5 c = 1'b1; #5 c = 1'b0; #5 c = 1'b1; #5 c = 1'b0; end assign a = b; assign #20 a = c; //因为连续赋值有延迟,而25ns后每次c改变的脉冲都小于20ns,所以没有进行赋值,最后的c值为0,因此a的值一直是0

向量的位选、域选

当位选超出界限时,结果为1'bx。当域选超出界限时,超出的部分在返回时会用x值填充。当数组索引超出界限时,结果为全x值,如例12所示。关于向量的位选、域选的详情,参考操作数的位选和域选。

​# 例12 module test; reg [2:0]b; reg [2:0]c[1:0]; initial begin b = 3'b111; $display("result is %b",b[3]); //结果为x b = 3'b111; $display("result is %b",b[4:2]); //结果为xx1 $display("result is %b",c[2]); //结果为xxx end endmodule

x信号对于各运算符的特性

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

算数运算符

对于算术运算符,当操作数中出现了x信号时,即使结果能全部或部分确认,结果为全x值,如例1所示。

# 例1 module test; reg [2:0]a, b; initial begin a = 3'b001; b = 3'bx01; $display("result is %b",a+b); //结果为xxx a = 3'b001; b = 3'bx01; $display("result is %b",a-b); //结果为xxx a = 3'bx01; b = 3'b000; $display("result is %b",a*b); //结果为xxx a = 3'b000; b = 3'bx01; $display("result is %b",a/b); //结果为xxx a = 3'b000; b = 3'bx01; $display("result is %b",a%b); //结果为xxx a = 3'b000; b = 3'bx01; $display("result is %b",a**b); //结果为xxx end endmodule

如果除法运算符的第二个操作数为0,结果为全x值,如果乘方运算符的第一个操作数为0,而第二个操作数为负数,结果为全x值,如例2所示。

# 例2 module test(); reg [2:0]a,b; initial begin a = 3'b001; b = 3'b000; $display("result is %b",a/b); //结果为xxx a = 3'b000; b = -3'b001; $display("result is %b",a ** b); //结果应为xxx,但遗憾的是似乎没有仿真器遵守了这一点(结果为000) end endmodule

关系运算符

对于关系运算符,当操作数中出现了x信号时,即使结果能确定,结果为1'bx,如例3所示。

​# 例3 module test; reg [2:0]a, b; initial begin a = 3'b001; b = 3'b1x1; $display("result is %b",a<b); //结果为x a = 3'b001; b = 3'b1x1; $display("result is %b",a<=b); //结果为x a = 3'bx01; b = 3'b000; $display("result is %b",a>b); //结果为x a = 3'bx01; b = 3'b000; $display("result is %b",a>=b); //结果为x end endmodule

相等运算符

对于逻辑相等和不相等运算符即==和!=,当操作数中出现了x信号时,如果结果能确定,则结果正常输出;如果结果不能确定,结果为1'bx,如例4所示。

​# 例4 module test; reg [2:0]a, b; initial begin a = 3'b001; b = 3'b1x1; $display("result is %b",a!=b); //结果为1 a = 3'b001; b = 3'b0x1; $display("result is %b",a!=b); //结果为x a = 3'b001; b = 3'b1x1; $display("result is %b",a==b); //结果为0 a = 3'b001; b = 3'b0x1; $display("result is %b",a==b); //结果为x end endmodule

对于精确相等和精确不相等运算符即===和!==,它类似于case语句种的比较,操作数中的x信号必须精确相等,因此结果只能是0或1,如例5所示。

​# 例5 module test; reg [2:0]a, b; initial begin a = 3'b101; b = 3'b1x1; $display("result is %b",a===b); //结果为0 a = 3'b1x1; b = 3'b1x1; $display("result is %b",a===b); //结果为1 a = 3'b101; b = 3'b1x1; $display("result is %b",a!==b); //结果为1 a = 3'b1x1; b = 3'b1x1; $display("result is %b",a!==b); //结果为0 end endmodule

逻辑运算符

对于逻辑运算符,当操作数中出现了x信号时,如果结果能确定,则结果正常输出;如果结果不能确定,结果为1'bx,如例6所示。

​# 例6 module test; reg [2:0]a, b; initial begin a = 3'b101; b = 3'bx00; $display("result is %b",a||b); //结果为1 a = 3'bx00; b = 3'bx00; $display("result is %b",a||b); //结果为x a = 3'bx01; b = 3'bx01; $display("result is %b",a&&b); //结果为1 a = 3'bxx0; b = 3'bxx0; $display("result is %b",a&&b); //结果为x a = 3'b1x1; $display("result is %b",!a); //结果为0 a = 3'b00x; $display("result is %b",!a); //结果为x end endmodule

位运算运算符

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

​# 例7 module test; reg [2:0]a, b; initial begin a = 3'b11x; b = 3'bx1x; $display("result is %b",a&b); //结果为x1x a = 3'bxxx; b = 3'b10x; $display("result is %b",a|b); //结果为1xx a = 3'bx0x; b = 3'bxx1; $display("result is %b",a^b); //结果为xxx a = 3'bx0x; b = 3'bxx1; $display("result is %b",a~^b); //结果为xxx a = 3'b1x0; $display("result is %b",~a); //结果为0x1 end endmodule

规约运算符

对于规约与运算符&,如果操作数中存在0,结果为0(不管是否含有x值),对于规约或运算符|,如果操作数中存在1,结果为1(不管是否含有x值)。其他情况下,如果操作数中有x值,则结果为1'bx。如例8所示。

​# 例8 module test; reg [2:0]a, b; initial begin a = 3'b10x; $display("result is %b",&a); //结果为0 a = 3'b1xx; $display("result is %b",&a); //结果为x a = 3'b10x; $display("result is %b",|a); //结果为1 a = 3'b00x; $display("result is %b",|a); //结果为x a = 3'b1xx; $display("result is %b",^a); //结果为x end endmodule

移位运算符

对于逻辑移位运算符即<<和>>是补0移位,对于算数移位运算符即<<<和>>>,当作用于有符号的操作数,算数右移>>>时会在高位补符号位(最高位),其他情况下,逻辑移位和算数移位效果一样。当移位运算符的右操作数中有x值时,结果为全x值。如例9所示。

​# 例9 module test; reg signed [2:0]b; initial begin b = 3'b1x1; $display("result is %b",b>>1); //结果为01x b = 3'b1x1; $display("result is %b",b<<1); //结果为x10 b = 3'bx01; $display("result is %b",b>>>1); //结果为xx0 b = 3'bx01; $display("result is %b",b<<<1); //结果为010 end endmodule

条件运算符?:

对于条件运算符?:,当第一个操作数种出现x值时,会对第二个和第三个操作数每一位按照以下规则进行检测,并给出结果。如例10所示。

​# 例10 module test; reg [2:0]a, b; reg c; initial begin a = 3'b1x0; b = 3'b100; c = 1'bx; $display("result is %b",c?a:b); # 结果为1x0 end endmodule

连接运算符

对于连接运算符,某一位的x值不会影响其它位,如例11所示。

​# 例11 module test; initial begin $display("result is %b",{1'bx,3'b111}); //结果为x111 end endmodule
http://www.jsqmd.com/news/654995/

相关文章:

  • Modern Web架构原理:深入理解现代Web工具的设计思想
  • 动态规划解题框架
  • 3分钟快速上手:用Vue+SVG轻松绘制专业网络拓扑图
  • Navicat Mac版试用期重置全攻略:突破14天限制的终极方案
  • MogFace人脸检测模型-WebUI多场景:远程办公系统中会议参与者专注度基线建模
  • 终极音乐解锁指南:3分钟学会浏览器中解密加密音乐文件
  • Llama-3.2V-11B-cot效果展示:复杂场景下‘反常细节’识别准确率实测
  • ESP32开发板选购避坑指南:从NodeMCU到安信可,新手如何避免踩雷?
  • 一文学会Windows系统日志文件清理,让电脑重获新生!
  • Windows PowerShell 查看特定网卡的详细信息
  • RexUniNLU DeBERTa-v2中文base模型调用教程:modelscope pipeline零代码接入详解
  • 别再被SSH自动断开坑了!保姆级配置教程(CentOS/Ubuntu通用)
  • 终极音频解密指南:如何在浏览器中轻松解锁加密音乐
  • Android X5WebView内核加载失败:从诊断到自动修复的完整实践
  • 终极指南:Mooncake存储引擎从内存分配到SSD卸载的完整技术优化方案
  • 如何用智能KMS激活工具彻底告别Windows和Office激活烦恼
  • Bebas Neue:如何免费获取专业级标题字体解决方案的终极指南
  • 数字IC前端学习笔记:异步复位,同步释放
  • 发膜使用报告:20款热门发膜一个月后效果 - 博客万
  • Poppler for Windows终极指南:免费开源PDF处理工具快速上手
  • AI大模型API流式调试进阶:Apipost中的SSE数据解析与可视化实战
  • PufferLib PyTorch集成最佳实践:神经网络模型构建与训练优化终极指南
  • 天龙八部GM工具:单机游戏数据管理的终极解决方案
  • Zotero Reference终极指南:5分钟掌握PDF文献自动引用提取
  • Kali Linux 2024.1 默认Zsh了,但你的oh-my-zsh主题乱码解决了吗?
  • 深聊超声波喷涂制造整套装置生产企业,选哪家国内知名,技术专业 - 工业品牌热点
  • 护发精油排行榜测评:6款热门护发精油品牌产品对比 - 博客万
  • 基于Simulink的开关电容变换器电压均衡控制
  • 终极指南:如何使用py-googletrans实现免费无限的Google翻译API功能
  • 分析性价比高的消泡剂源头厂家,选购时需要注意什么 - 工业推荐榜