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

    文章

    988

    浏览量

    82995
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109302
  • HDL
    HDL
    +关注

    关注

    8

    文章

    323

    浏览量

    47104
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66784
  • 综合器
    +关注

    关注

    0

    文章

    8

    浏览量

    6381

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

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

收藏 人收藏

    评论

    相关推荐

    rtthread编译后如何查看堆栈空间使用情况

    rtthread编译后如何查看堆栈空间使用情况,现在只能在编译完成后看到总大小,有没有办法能看到详细的使用情况。 由于RAM只有128K,除去内存池32k,想看看剩余的RAM在哪用了
    发表于 03-05 07:58

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

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

    linux的系统内存使用情况查看

    通过free命令可以查看系统内存使用情况
    发表于 07-15 06:43

    如何查看RAM使用情况

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

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

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

    ucosiii堆栈使用情况检测使用率100%?

    用OSTaskStkChk函数检测堆栈的使用情况,发现有两个任务使用情况为100%,堆栈设置为1024,增大堆栈到2048,依然使用率100%,该任务代码很短,一直运行,虽然使用率100%,但是程序正常运行并未崩溃,请问这是由于什么原因造成堆栈检测使用率100%?
    发表于 04-20 22:56

    电池使用情况统计信息

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

    LPC11U68如何在我的代码中计算闪存的使用情况

    我正在为我的项目使用 LPC11U68。当我 MCUXpresso IDE 上构建我的项目时,我看到了我的闪存的使用情况。我知道有些 MCU 有给定的函数或宏,可以提供闪存的闪存使用情况
    发表于 03-17 08:40

    如何检查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 3935次阅读
    在Linux系统下使用top命令查看CPU<b class='flag-5'>使用情况</b>

    SAS运算符in在宏语句中的应用

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

    LPC86x ACMP使用情况

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

    LPC86x ADC使用情况

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