verilog中条件分支语句的综合问题
在·Verilog中有两种可综合的条件结构:
if(expression)
Statement block
else if(expression)
Statement block
else
Statement blockcase(expression)
case item : case action
...
(default : case action)
endcase
若条件结构的所有可能情况都被考虑到了就称为完整,如前两句:
if(select) out=in;
else out=~in;
if(select) out=in;
完整的if语句会综合出一个多路选择器。而不完整的if语句则会综合其他结构,如后一句就会综合出一个D型触发器,即综合器默认select为假时,保持原先的值。
对于超过三个以上的分支选项时,就会优先选择case语句。
case语句如上例所示,其中default是可选的,而且和C语音不同,case语句在第一个相匹配的case item被执行后就会终止后面case item语句的执行。case·语句是逐位比较expression的值和分支case item的值,同时case item中的X,Z也是作为正常值进行比较。于是有了另外两种case语句的变种:
casex : 将表达式和分支中的z和?符号看成是无关项。
casez : 将表达式和分支中的x,z和?符号看成是无关项。
如果所有可能情况都被考虑到,则称这样的case语句为完整的。同时如果所有情况都是相互独立的则称为并行。
因此在case语句中可能出现以下四种情况:
完整,并行。模块full_Parallel综合成多路选择器。
文章图片
文章图片
不完整,并行。模块nfull_Parallel综合成锁存器。
文章图片
文章图片
完整,不并行。模块full_nParallel综合成优先级结构。
文章图片
文章图片
当select=2'b11时,就需要进行选择,这是综合的结果选择第一个分支,因为它位于case列表的最高行,最接近输出端,具有更高的优先级。
不完整,不并行。模块nfull_nParallel综合成带优先级结构的锁存器。
文章图片
文章图片
由以上几种情况可以看出,对一个实现组合逻辑的无时钟的过程块,在每次执行时如果不能给每个变量重新赋值(即分支情况不完整),就会产生锁存器。解决办法是确保每一条case语句都有一条default语句。如图所示
文章图片
文章图片
同时当一个过程块有多个输出,但在执行时并没有在所有可能组合状态下对每一个输出赋值,也可能综合出额外的触发器。解决办法是在过程块开始执行时对所有输出赋缺省值,如果与设计不冲突的话,可以使用无关项。
【verilog中条件分支语句的综合问题】
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理