为何Verilog条件语句if中无法用通配符?代码输出异常求助
问题1:为何在Verilog条件语句的if中无法使用通配符?
- Verilog里的
==是逻辑相等比较运算符,你写的3'b0??里的?会被解析为未知值X,而非通配符。 - 任何确定值和X做
==比较,结果都是X;在if条件判断中,X会被视为逻辑假,因此永远走else分支,根本达不到通配匹配的效果。 - 要是想在条件判断里实现通配匹配,要么用
casez/casex语句,要么在SystemVerilog中用$matches系统函数,或者手动做位掩码操作(比如用(a & 3'b100) == 0来匹配最高位为0的情况)。
问题2:代码输出“no”和“no1”的原因
先看你的代码:
bit[2:0] a; a=3'b001; if(a==3'b0??) $display("ok"); else $display("no"); case(a) 3'b0?? : $display("ok1"); default: $display("no1"); endcase
- if分支的问题:和问题1原因一致,
3'b0??里的?是X,3'b001 == 3'b0XX的结果为X,if条件判定为假,所以执行$display("no")。 - case分支的问题:默认的
case语句是精确匹配,这里的3'b0??作为分支项,其中的?是X,只有当a的对应位也是X时才会匹配。但你的a是确定的3'b001,没有X位,因此不匹配该分支,走到default输出no1。 - 要是想实现通配匹配效果,把
case改成casez就行——casez会把?当作无关位,此时3'b001和3'b0??就能匹配,输出ok1。
内容的提问来源于stack exchange,提问作者Yike Wang
相关产品推荐
相关产品推荐

