在用Verilog进行RTL代码编写的时候基本不会用到case(1‘b1),而且一般的语法说明也如下:
case(case_expr)condition1 : true_statement1 ;condition2 : true_statement2 ;……default : default_statement ;
endcase//case 语句执行时,如果 condition1 为真,则执行 true_statement1 ;
//如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。
//如果各个 condition 都不为真,则执行 default_statement 语句。
因此遇到case(1‘b1)的情况会比较迷惑,这里对case(1‘b1)的情况做个说明。
下面的例子就很好地说明了使用方法。case(1‘b1)的写法与if-else的写法得到的结果是一样的,即均完成了优先级的编码:
case(1'b1):
module encoder(
input D0,
input D1,
input D2,
input D3,
input D4,
input D5,
input D6,
input D7,
output reg [2:0]Q2Q1Q0);
always@(*)begin
Q2Q1Q0=0;
case(1'b1)
D0:Q2Q1Q0=3'b000;
D1:Q2Q1Q0=3'b001;
D2:Q2Q1Q0=3'b010;
D3:Q2Q1Q0=3'b011;
D4:Q2Q1Q0=3'b100;
D5:Q2Q1Q0=3'b101;
D6:Q2Q1Q0=3'b110;
D7:Q2Q1Q0=3'b111;
endcase
end
endmodule
if-else:
module encoder(
input D0,
input D1,
input D2,
input D3,
input D4,
input D5,
input D6,
input D7,
output reg [2:0]Q2Q1Q0);always@(*)
begin
Q2Q1Q0=3'b000;
if(D0) Q2Q1Q0=3'b000;
else if(D1) Q2Q1Q0=3'b001;
else if(D2) Q2Q1Q0=3'b010;
else if(D3) Q2Q1Q0=3'b011;
else if(D4) Q2Q1Q0=3'b100;
else if(D5) Q2Q1Q0=3'b101;
else if(D6) Q2Q1Q0=3'b110;
else if(D7) Q2Q1Q0=3'b111;end endmodule
小结:case和if-else都是有优先级的,case语句也是先判断写才前面的情况是否满足,前面的满足了就直接跳出case了。一直印象里的并行处理是一般写法中case的的控制表达式是互斥的,但是在case(1‘b1)的写法中,处理逻辑就如上所述。
目前来说,现在的仿真和综合工具已经足够强大,最后综合后的结果if..else...与case...语句其实是一样的,无非是两种不同的实现方式。