蜂鸟E203处理器系统如下图所示
wire flg_r
wire flg_nxt = ~flp_r;
wire flg_ena
sirv_gnrl_dfflr #(1) flg_dfflrs(flg_ena, flg_r, flg_nxt ,clk, rst_n);
实际上sirv_gnrl_dfflr 是一个使用Verilog语法的always块编写的DFF模块。
if else无法捕捉不定态,使用这个DFF模块还可以捕捉不定态,一旦输入是不定态就会退出仿真并且报错。
verilog的if else和case语法存在两大缺点:
对于if-else不能传播不定态,以如下代码为例。假设a的值为X(不定态),按照Verilog语法它会将等效于 a==0 ,从而让out等于 in2 ,最终没有将X传播出去。这种情况可能会在仿真阶段掩盖某些致命的bug,造成芯片功能错误。
if (a)
out = in1;
else
out = in2;
使用assign语法的话,则会将X传播出去,从而让out也等于X。
aassign out = a ? in1:in2;
Veriog的case语句同样不会传播不定态,同时if-else和case也会形成优先级选择电路如
if(sel1)
out = in1[3:0];
else if (sel2)
out = in2[3:0];
else if (sel3)
out = in3[3:0];
else
out = in4[3:0];
使用assign的话,假如确实是生成一处有优先级的选择电路则
assign out = sel1 ? in1[3:0]:
sel2 ? in2[3:0]:
sel3 ? in3[3:0]:
in4[3:0];
而如果要生成并行的选择逻辑,则利用assign语法明确地写成"于或"的逻辑
assign out = ({4{sel1}} & in1[3:0])
|({4{sel2}} & in2[3:0])
|({4{sel3}} & in3[3:0])
{ }表示拼接,{第一位,第二位…};
{{ }}表示复制,{4{a}}等同于{a,a,a,a};
&是按位与 |是按位或