0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

考虑x和z在verilog条件语句中的使用情况

全栈芯片工程师 来源:全栈芯片工程师 2023-11-02 09:40 次阅读

首先,考虑x和z在verilog条件语句中的使用情况,然后我们再考虑在verilog中用x和z给其他reg/wire赋值的情况。

(一)首先,考虑x和z在verilog条件语句中的使用情况。


Verilogcase语句中,2'b1x和2’b0x造成的仿真器、综合器的mismatch,

举个例子:

Simulators:

match2'b1xto11or10

match2’b0xto01or00

HDLCompilertool

both2'b1xand2’b0xareevaluatedtofalse. Becauseofthesimulationandsynthesismismatches,theHDLCompilertoolissuesanELAB-310warning.

case(A)
2'b1x:...//Youwant2'b1xtomatch11and10but
//HDLCompileralwaysevaluatesthiscomparisontofalse
2'b0x:...//youwant2'b0xtomatch00and01but
//HDLCompileralwaysevaluatesthiscomparisontofalse
default:...
endcase

官方说明:我们可以得到两点信息

98dd139e-78c9-11ee-939d-92fbcf53809c.png



第一点:


Asimulatorevaluatesanunknown(x)orhighimpedance(z)asadistinctvaluedifferentfrom0or1;however,anxorzvaluebecomesa0or1duringsynthesis.



第二点:



DC工具会直接将verilog比较判断语句中的xorz直接理解为false。所以禁止在verilog比较判断语句中使用xorz。


参见如下代码,DC工具会理解if(A==1'bx)为false,因此DC会直接assigns1toregB并且报ELAB-310warning.

moduletest(
inputA,
outputregB
);
always@(*)begin
if(A==1'bx)
B=0;
else
B=1;
end
endmodule



实际综合如下,果不其然,有意思哇!后面几个稍微复杂点的代码更有趣!

99049b62-78c9-11ee-939d-92fbcf53809c.png




再补充z的使用:

990c9556-78c9-11ee-939d-92fbcf53809c.png

结论:仿真工具可以理解x、z、0、1状态,但是综合工具遇到带x、z的比较判断条件时,直接理解该条件为false。



(二)然后我们再考虑在verilog中用x和z给其他reg/wire赋值的情况。




案例1:z赋值是没问题的,会综合出来三态门,参见如下代码1:

modulethree_state(ENABLE,IN1,OUT1);
inputIN1,ENABLE;
outputregOUT1;


always@(ENABLEorIN1)begin
if(ENABLE)
OUT1=IN1;
else
OUT1=1'bz;//assignshigh-impedancestate
end
endmodule

99341a40-78c9-11ee-939d-92fbcf53809c.png

994c588a-78c9-11ee-939d-92fbcf53809c.png

Logicalbufferofasingleinputwithanactive-highoutputenable.Theoutputis3-statedwhentheenableislow.




真值表:

9959323a-78c9-11ee-939d-92fbcf53809c.png



案例2:z赋值是没问题的,会综合出来三态门,参见如下代码2:

modulex_state(IN1,OUT1);
input[1:0]IN1;
outputreg[1:0]OUT1;


always@(*)begin
case(IN1)
2'b00:OUT1=2'b00;
2'b01:OUT1=2'b01;
2'b10:OUT1=2'b10;
default:OUT1=2'bzz;//assignshigh-impedancestate
endcase
end
endmodule

995e6890-78c9-11ee-939d-92fbcf53809c.png

9971e6c2-78c9-11ee-939d-92fbcf53809c.png




再看X赋值是什么情况。


案例1:利用DC综合工具实测如下代码综合效果:

modulex_state(IN1,OUT1);
input[1:0]IN1;
outputreg[1:0]OUT1;


always@(*)begin
case(IN1)
2'b00:OUT1=2'b01;
2'b11:OUT1=2'b00;
default:OUT1=2'bxx;
endcase
end
endmodule

997c693a-78c9-11ee-939d-92fbcf53809c.png

可见,x赋值直接被DC工具省略,也没有latch出现。

案例2:

modulex_state(IN1,OUT1);
input[1:0]IN1;
outputreg[1:0]OUT1;


always@(*)begin
case(IN1)
2'b00:OUT1=2'b00;
2'b01:OUT1=2'b01;
2'b10:OUT1=2'b10;
default:OUT1=2'bxx;//assignshigh-impedancestate
endcase
end
endmodule

999f6e08-78c9-11ee-939d-92fbcf53809c.png

可见,x赋值直接被DC工具省略,也没有latch出现。

案例3:注释掉default,非full_case,必然出现latch!

modulex_state(IN1,OUT1);
input[1:0]IN1;
outputreg[1:0]OUT1;


always@(*)begin
case(IN1)
2'b00:OUT1=2'b00;
2'b01:OUT1=2'b01;
2'b10:OUT1=2'b10;
endcase
end
endmodule

99a42da8-78c9-11ee-939d-92fbcf53809c.png

因此,尽管x赋值直接被DC工具省略,也没有latch出现,但是仍然建议不要使用x赋值,除非full_case情况下,不会执行default条件下的x赋值分支,写x赋值可以用于仿真查看波形,如下代码所示:

always@(*)begin
case(pmu_state)
//Duringpowerdownsequence,shiftingpatterntoactive
//ISOLATE->RETAIN->PWRDOWN
//andstayunchangeduringpowereddownstate
`ARM_POWERING_DOWN,`ARM_POWERED_DOWN:begin
nxt_isolate_n=1'b0;
nxt_retain_n=ISOLATEn;
nxt_pwrdown=~RETAINn;
end


//Duringpowerupsequence,shiftingpatterntoactive
//PWRDOWN->RETAIN->ISOLATE
`ARM_POWERING_UP,`ARM_POWERED_UP:begin
nxt_pwrdown=1'b0;
nxt_retain_n=~PWRDOWN;
nxt_isolate_n=RETAINn;
end


//PropagateX
default:begin
nxt_isolate_n=1'bX;
nxt_retain_n=1'bX;
nxt_pwrdown=1'bX;
end
endcase
end

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    1018

    浏览量

    83739
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110091
  • HDL
    HDL
    +关注

    关注

    8

    文章

    327

    浏览量

    47382
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68591
  • 综合器
    +关注

    关注

    0

    文章

    10

    浏览量

    6454

原文标题:Verilog中,2'b1x和2’b0x造成的仿真器、综合器的mismatch​!

文章出处:【微信号:全栈芯片工程师,微信公众号:全栈芯片工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CUBEIDE运行完可以看RAM的使用情况,运行中可以实时查看RAM的使用情况吗?

    CUBEIDE运行完可以看RAM的使用情况,运行中可以实时查看RAM的使用情况吗?以及负载情况? 图片是运行完可以看RAM使用情况,是否可以运行中实时查看?是不是cubemonito
    发表于 03-12 07:56

    如何查看RAM使用情况

    嗨, 我正在使用STM32L053 Nucleo,我已经为它运行了一些代码,我希望做一个RAM估计来查看当前固件的RAM使用情况。如何查看RAM使用情况? 问候#记忆
    发表于 08-05 10:08

    Android应用的内存使用情况检查方法

    如何检查 Android 应用的内存使用情况
    发表于 03-30 13:36

    电池使用情况统计信息

    电池使用情况信息根据电池使用情况统计信息和电源配置文件中的值计算得出。电池使用情况统计信息框架可通过跟踪设备组件不同状态下维持的时间来自动确定电池
    发表于 12-31 07:01

    如何检查imx6中的GPU使用情况

    板上运行 Qt6 应用程序,想观察该 Qt6 应用程序对 GPU 的使用情况。 如何检查应用程序的 GPU 使用情况或该应用程序是否真的使用 GPU?我们可以查看和确认该
    发表于 05-22 07:04

    SoC如何查看内存使用情况

    查看系统内存: free -h 查看ION内存 NPU内存使用情况: cat /sys/kernel/debug/ion/bm_npu_heap_dump/summary | head -2VPU
    发表于 09-19 07:23

    主流GPS芯片使用情况

    主流GPS芯片使用情况
    发表于 11-27 14:34 13次下载

    Linux系统下使用top命令查看CPU使用情况

    Linux系统下,使用top命令查看CPU使用情况
    发表于 07-10 11:46 4402次阅读
    <b class='flag-5'>在</b>Linux系统下使用top命令查看CPU<b class='flag-5'>使用情况</b>

    STM32/KEIL/MDK 查看 FLASH 和 RAM 使用情况

    STM32/KEIL/MDK 查看 FLASH 和 RAM 使用情况
    发表于 12-02 09:06 13次下载
    STM32/KEIL/MDK 查看 FLASH 和 RAM <b class='flag-5'>使用情况</b>

    SAS运算符in语句中的应用

    前面通过对SAS Base的学习,我想大家对in运算符并不陌生,它广泛的应用于数据步或SQL条件语句中,进行条件判断或数据筛选,进而访问特定观测值。
    的头像 发表于 05-19 14:38 2287次阅读
    SAS运算符in<b class='flag-5'>在</b>宏<b class='flag-5'>语句中</b>的应用

    LPC86x上的开关矩阵使用情况

    电子发烧友网站提供《LPC86x上的开关矩阵使用情况.pdf》资料免费下载
    发表于 08-17 10:48 0次下载
    LPC86<b class='flag-5'>x</b>上的开关矩阵<b class='flag-5'>使用情况</b>

    LPC86x ACMP使用情况

    电子发烧友网站提供《LPC86x ACMP使用情况.pdf》资料免费下载
    发表于 08-17 10:34 0次下载
    LPC86<b class='flag-5'>x</b> ACMP<b class='flag-5'>使用情况</b>

    LPC86x ADC使用情况

    电子发烧友网站提供《LPC86x ADC使用情况.pdf》资料免费下载
    发表于 08-16 10:42 0次下载
    LPC86<b class='flag-5'>x</b> ADC<b class='flag-5'>使用情况</b>

    python if语句多个条件怎么用

    Python中,可以使用多个条件来编写if语句。这些条件可以使用逻辑运算符进行组合,包括and、or和not。 当if语句中有多个
    的头像 发表于 11-21 16:45 3040次阅读

    TMS320C64x高性能DSP应用中的高速缓存使用情况

    电子发烧友网站提供《TMS320C64x高性能DSP应用中的高速缓存使用情况.pdf》资料免费下载
    发表于 10-21 09:43 0次下载
    TMS320C64<b class='flag-5'>x</b><b class='flag-5'>在</b>高性能DSP应用中的高速缓存<b class='flag-5'>使用情况</b>