Verilog编程之道-ca语句

更新时间:2023-07-04 14:22:38 阅读: 评论:0

Verilog编程之道-ca语句
ca语句,是包含在ca和endca之间的代码,逻辑上等价于if-el语句,使⽤⽅法如下:
ca (ca_expression)
ca_item1 : ca_item_statement1;
ca_item2 : ca_item_statement2;
ca_item3 : ca_item_statement3;
ca_item4 : ca_item_statement4;
default    :  ca_item_statement5;房中秘术
endca
caz语句,允许"z" 和 "?"值在⽐较时被当作不关⼼,"z" 和 "?"时等价的。
注意:当编写可综合代码时,要⼩⼼使⽤caz;使⽤caz时,最好使⽤"?" 表⽰不关⼼,不能使⽤"z" 表⽰不关⼼。cax语句,允许"x" "z" 和 "?"值在⽐较时被当作不关⼼.
注意:当编写可综合代码时,不要使⽤caz
ca语句执⾏过程:
1. 每次执⾏ca语句时,括号内ca expression 只计算⼀次,然后按照从上到下的顺序与每个ca item⽐较。
2. 如果有ca default ,那么在这个从上到下的⽐较过程中忽略它。
3. 如果有⼀个ca item 与 ca expression 匹配上,那么就执⾏此ca item语句,然后终⽌ca语句。
·        4. 如果所有⽐较都失败,⽽且有ca default,那么就执⾏ca default语句,然后终⽌ca语句。
5.如果所有⽐较都失败,⽽且没有ca default,那么就终⽌ca语句。
注意:1  排在前⾯的ca item 具有更⾼的优先级。
2 所有的ca expression 和 ca item的位长都将调整到最长的位长。
3 如果有⼀个时unsigned,那么所有都按照unsigned调整。
ca应⽤
ca可以检查x和z
ca (sig)
1'bz : $display ("signal is floating");
1'bx : $display ("signal is unknown");
default : $display ("signal is %b" ,sig);
endca
ca item中有x和z时,这段代码时不可综合的
可使⽤反向ca语句,⽽且是优先级编码器。
reg [2:0] encode;
ca (1)
encode[2] :$display ("Select Line 2");
encode[1] :$display ("Select Line 1");
encode[0] :$display ("Select Line 0");
default  :$display ("Error: Only one of the bits is expected ON");
endca
ca 语句可以时full 和parallel :若是full,就不会产⽣latch ; 若是parallel ,就不会产⽣优先级编码器。综合⼯具⼀般可以⾃由推导出是否是full 或parallel。
// 这段代码就是full ⼜是 parallel ,因此既不会⽣产Latch 也不会⽣成优先级编码器
always @ (*)
begin
ca (l)
2'b00: outc = a;
2'b01: outc = b;
2'b10: outc = c;
社会福利包括哪些2'b11: outc = d;
endca
end
// 若使⽤if ,就会⽣成优先级编码器。
always @ (*)
begin
if(l == 2'b00) outi = a;
el if (l == 2'b01) outi = b;
el if (l == 2'b10) outi = c;
el                  outi = d;
end
caz应⽤
在ca item中,0 1 z x都要进⾏⽐较,z和?对应的bit在⽐较时忽略,x不会被忽略。常⽤于实现优先编码器。
十二五规划纲要
//实现指令译码,优先级编码器
reg [7:0] ir;
caz (ir)
8'b1 : instruction1(ir);
8'b01 : instruction2(ir);
8'b00010 : instruction3(ir);
8'b000001?? : instruction4(ir);
endca
cax 会导致设计出现问题, 把x当作不关⼼,前后防结果不⼀致。复位前的⾼阻值在复位后将初始化错误隐藏。
// 在ca语句前给输出赋⼀个默认值,综合会当成full的ca语句,不会产⽣Latch
// 在ca前给出输出信号默认值,不会出现前后仿真不⼀致的情况。
module mux3c (y, a, b, c, l);
output    y;
input    [1:0] l;
input        a, b, c;
reg        y;
always @ ( a or b or c or l )
y = 1'b0 ;    //<====== default value
ca (l)
2'b00 : y = a;
法制黑板报
2'b01 : y = b;
2'b10 :y = c;
endca
endmodule
//使⽤full_ca综合指令
/
/仿真时,l = 2'b11 ,y 表现为Latch;综合时,⼯具把l == 2'b11时y输出当做不关⼼,从⽽导致前后防真不⼀致。
module mux3c (y, a, b, c, l);
output    y;
input    [1:0] l;
input        a, b, c;
reg        y;
带安的名字女孩
写作顺序有哪些always @ ( a or b or c or l )
ca (l)        // synopsys full_ca
2'b00 : y = a;
2'b01 : y = b;
2'b10 :y = c;
endca
endmodule
full_ca会优化设计,导致设计结果出错。
full_ca还是有可能⽣成Latch(ca中对多个输出进⾏赋值)
消除Latch最简单的⽅法:在always块的敏感表下⾯,在执⾏ca语句之前为每个输出都赋⼀个默认值。
parallel_ca是指ca expression只能匹配⼀个ca item的语句。如果发现ca expression能够匹配超过⼀个的ca item,那么这些匹配的ca item被称为overlapping ca item,这个ca语句就不是parallel
// Synopsys dc_shell 在读⼊Verilog⽂件时,如果full_ca语句⽤在不是full的ca语句上会报告warning
// Non_full ca statement with "full_ca" directive
// parallel_ca同样会出现警告。
//该警告会使设计崩溃。
ca语句的编码原则
1 对于编写表达式并⾏的设计,ca语句是不错的选择,可使代码更加整洁
2 在设计可综合代码时,要⼩⼼使⽤caz语句,不要是要cax语句
3 要⼩⼼使⽤反向ca语句,最好只针对时parallel的ca语句使⽤
4 要⼩⼼使⽤caz设计优先级编码器,可以⽤if-el-if语句实现优先级编码器,这样意图更明显更换ip地址
秋收的季节5 在使⽤caz语句时,⽤?表⽰不关⼼的位。
6 最好为ca语句添加ca default,⽽且不要把输出值赋值未x

本文发布于:2023-07-04 14:22:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1078044.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:语句   设计   综合   编码器   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图