Verilog(2)关于选择
时序电路或者组合逻辑中都会遇到根据相应的情况选择相应的逻辑处理方式或者结果的情况,这时候一般会使用到大概有以下三种方式:
第一种是采用assign result=(condition)?result1 :result2;这种语法来进行信号的选择,采用的逻辑是?:的方式,condition为1则result为result1,否则就会为result2,;不过这个表达方式只能表示组合逻辑,不能写在时序模块中区,当然,之前我们介绍过assign和deassign这种赋值方式,不过在时序逻辑中不会采用这种方式来表示相应的选择;不过这种表述方式可以真实的表述电路的实际行为,在仿真的时候仿真结果与电路行为是一致的,所以组合逻辑推荐使用这种方式来表达。
第二种是采用if,else这种结构来表述,这种结构要放在always这种procedural block中,如下这种表述:
always @( result1 orresult2)
if(condition1) begin
result = result1;
end
else if(condition2)begin
result = result2;
end
end
不过实际电路中可能会存在unknown的信号,x这个时候result根据result1和result2的值是否相同就会有不同的表现,有的时候会给result加上相应的默认值,比如说在always block下加上一句result=0;这时候就会给result一个默认值,假如不满足condition(condition1和condition2的情况是fullcase,但并不一定不会出现unknown而两个都不匹配的现象)的情况,这时候就会保持result为0,但如果result在这个模块之前就存在,而且值为1,经过模块后值仍然为1,则会出现中间有一个暂态0,这是一个很小的毛刺,可能会对电路产生很大的影响,不注意这个问题的话会使设计产生很大的问题,假如最后加上一个else result=0,则回产生实际电路行为和仿真结果不符合的情况,这个需要注意下;所以一般在写的时候要很注意fullcase,避免出现unknown信号,组合逻辑建议使用第一种方式。
第三种,采用case语句,除了case还存在相应的casez和casex的表述方式,这三个有一定的区别;casez会把z和?当做don’t care,而casex会把?,z和x当做don’t care,这三种都是可以综合的,不过一般在实际项目中不会出现casex的情况,这是因为电路中出现了unknown不能忽视:,具体用法格式如下:
always @(con or result1or result2)begin
case(con)
con1 : result =result1;
con2: result=result2;
endcase
end
上面的always中的模块,不管是if还是case,组合逻辑采用blocking assignment=,时序逻辑采用non-blocking assignment<=.