当前位置:首页 > EDA > 电子设计自动化
[导读]在rtl仿真中,有四种状态,分别是0、1、x(unknown values)和z(high-impedance values)。

1、语法说明

在rtl仿真中,有四种状态,分别是0、1、x(unknown values)和z(high-impedance values)。

case 结构体中:0,1,X与Z是四种不同的状态,case条件比较时会检测比较双方每个bit是否完全相等。

casez 结构体中:把Z当做don’t care conditions,case条件比较时,比较双方存在Z值的bit位不参与比较 ,其他比特位相等则视为条件命中

casex 结构体中:把Z和X当做don’t care conditions,case条件比较时,比较双方存在Z或者X的bit位不参与比较,其他比特位相等则视为条件命中

在SystemVerilog和Verilog中,

case、casex、casez都是可综合的

在casex、casez中推荐使用 ?来替换Z和X

case、casex、casez语句中,如果命中多个case条件,则执行命中的第一个case

2、案例解析

always@(*)

begin

case(sel[1:0])

2'b00: data1 = 3'd0 ;

2'b01: data1 = 3'd1 ;

2'b10: data1 = 3'd2 ;

2'b11: data1 = 3'd3 ;

2'b1z: data1 = 3'd4 ;

2'b1x: data1 = 3'd5 ;

default: data1 = 3'd7 ;

endcase

end

always@(*)

begin

casez(sel[1:0])

2'b00: data2 = 3'd0 ;

2'b01: data2 = 3'd1 ;

2'b10: data2 = 3'd2 ;

2'b11: data2 = 3'd3 ;

2'b1z: data2 = 3'd4 ;

2'b1x: data2 = 3'd5 ;

default: data2 = 3'd7 ;

endcase

end

always@(*)

begin

casex(sel[1:0])

2'b00: data3 = 3'd0 ;

2'b01: data3 = 3'd1 ;

2'b10: data3 = 3'd2 ;

2'b11: data3 = 3'd3 ;

2'b1z: data3 = 3'd4 ;

2'b1x: data3 = 3'd5 ;

default: data3 = 3'd7 ;

endcase

end

always@(*)

begin

casez(sel[1:0])

2'b00: data4 = 3'd0 ;

2'b01: data4 = 3'd1 ;

2'b10: data4 = 3'd2 ;

2'b11: data4 = 3'd3 ;

2'b1?: data4 = 3'd4 ;

2'b1x: data4 = 3'd5 ;

default: data4 = 3'd7 ;

endcase

end

always@(*)

begin

casex(sel[1:0])

2'b00: data5 = 3'd0 ;

2'b01: data5 = 3'd1 ;

2'b10: data5 = 3'd2 ;

2'b11: data5 = 3'd3 ;

2'b1?: data5 = 3'd4 ;

2'b1x: data5 = 3'd5 ;

default: data5 = 3'd7 ;

endcase

end

case语句中4种状态都会比较匹配

sel[1:0]为1’b1z时,命中了[2'b1z: data2 = 3'd4 ;],data1被赋值3’d4

sel[1:0]为1’b1x时,命中了[2'b1x: data2 = 3'd5 ;],data1被赋值3’d5

casez语句中Z状态会被忽略,不做比较,X依旧进行比较

sel[1:0]为1’b1z时,实际仅比较sel[1],命中了[2'b10: data2 = 3'd2 ;]和[2'b1z: data2 = 3'd4; ],根据优先级原则, data2被赋值3’d2

sel[1:0]为1’b1x时,依旧比较sel[1:0],命中了[2'b1x: data2 = 3'd5 ;], data2被赋值3’d5

casex语句中Z和X状态会被忽略,不做比较

sel[1:0]为1’b1z时,实际仅比较sel[1],命中了[2'b10: data2 = 3'd2 ;], data3被赋值3’d2

sel[1:0]为1’b1x时,实际仅比较sel[1],命中了[2'b10: data2 = 3'd2 ;], data3被赋值3’d2

casez语句中采用?替换Z状态

sel[1:0]为1’b1z时,实际仅比较sel[1],命中了[2'b10: data2 = 3'd2 ;], data4被赋值3’d2

sel[1:0]为1’b1x时,同时命中了[2'b1?: data4 = 3'd4 ;]和[2'b1x: data4 = 3'd5 ;],根据优先级原则,data4被赋值3’d4

casex语句中采用?替换Z状态

sel[1:0]为1’b1z时,实际仅比较sel[1],命中了[2'b10: data2 = 3'd2 ;]、[2'b1?: data5 = 3'd4 ;]、[2'b1x: data5 = 3'd5 ;],根据优先级原则,data5被赋值3’d2

sel[1:0]为1’b1x时,实际仅比较sel[1],命中了[2'b10: data2 = 3'd2 ;]、[2'b1?: data5 = 3'd4 ;]、[2'b1x: data5 = 3'd5 ;],根据优先级原则,data5被赋值3’d2

图片

3、Do-not-care values 参考说明

SystemVerilog(IEEE Std 1800-2017)和verilog(IEEE P1364-2005)标准关于casez、casex的描述是一致的:截图如下:

verilog语法-浅谈case casez casex


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

function的作用返回一个数值,此数值由一串组合逻辑代码计算得到。 那为什么要用function呢?主要有两大原因:

关键字: verilog function

下面是一个小的真实verilog代码,具有异步set/reset逻辑(低电平有效)的触发器模型。这个verilog模型可以正确地综合,但在一个cornercase情况下仿真结果不正确。这个cornercase是什么?al...

关键字: corner verilog se

设计分2种,一种叫前向设计,另一种叫后向设计。 后向设计就是我们只知道需求,知道要实现什么功能,但是暂时脑子里还没有具体的结构。多数时候都是后向设计。此时,先开始把module的input和output写好。然后从out...

关键字: verilog 电路图

将Systemverilog中的数组和队列拿出来单独讲,是因为相对于其他的数据类型,数组和队列与C语言和Verilog语言的数组有着不同的特性。这些特性不仅体现在完全迥异于C语言的定义方式,也体现在其成员函数上。Syst...

关键字: System verilog

当前最流行的硬件设计语言有两种,即 VHDL 与 Verilog HDL,两者各有优劣,也各有相当多的拥护者。VHDL 语言由美国军方所推出,最早通过国际电机工程师学会(IEEE)的标准,在北美及欧洲应用非常普遍。而 V...

关键字: vhdl verilog

1. 前言如果你只是想检查Verilog文件的语法是否有错误,然后进行一些基本的时序仿真,那么IcarusVerilog就是一个不错的选择。相比于各大FPGA厂商的IDE几个G的大小,IcarusVerilog显得极其小...

关键字: verilog 开源

先简单介绍下同步时序和异步时序逻辑,看下他们的异同点。

关键字: hdl verilog 同步时序

为了应付日益增长的复杂性,必须提高抽象的水平。但当摩尔定律将SoC(系统单芯片)的复杂性加速到逃逸速度时,哪里能找到一种作为RTL(寄存器传输级)补充的新抽象方法?很多观察家注意到,面向硬件的文

关键字: ip SoC verilog

我现在最庆幸的事情就是从进入职场到现在一直是FPGA开发,我感觉,做FPGA开发这行经验是很重要的,入门简单,想提升会越来越难。做FPGA开发不只是会写写verilog和VHDL代码这么简单,我记得刚学习verilog的...

关键字: fpga开发 verilog vhdl代码

分频分为偶分频和奇分频。分频器从某种程度上来讲是计数器有计划的输出。1.偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟

关键字: verilog 3分频器
关闭