Verilog语法有关casez和casex的分析 2009-04-21 22:05
casez赋值问题
在casez的赋值中,如果是都满足,是只进行第一个赋值吗?是每回只判断一个符合就结束吗?
以下是一个例子:
module mux_casez(out,a,b,c,d,select);
output [1:0] out;
input [1:0] a,b,c,d;
input [3:0] select;
reg [1:0] out;
always @(select or a or b or c or d)
begin
casez(select)
4'b???1: out = a;
4'b??1?: out = b;
4'b?1??: out = c;
4'b1???: out = d;
endcase
end
endmodule
//测试 文件-----------------------------------------------------------------------------------------
module mux_casez(out,a,b,c,d,select);
output [1:0] out;
input [1:0] a,b,c,d;
input [3:0] select;
reg [1:0] out;
always @(select or a or b or c or d)
begin
casez(select)
4'b???1: out = a;
4'b??1?: out = b;
4'b?1??: out = c;
4'b1???: out = d;
endcase
end
endmodule
//以下是输出结果---------------------------------------------------------------------------------------------
# 0 a=xx b=xx c=xx d=xx select=xxxx out=xx
# 20 a=00 b=01 c=10 d=11 select=xxxx out=xx
# 40 a=00 b=01 c=10 d=11 select=zzzz out=00 //(1)------------------
# 60 a=00 b=01 c=10 d=11 select=xxx1 out=00
# 80 a=00 b=01 c=10 d=11 select=xx1x out=01
# 100 a=00 b=01 c=10 d=11 select=x1xx out=10
# 120 a=00 b=01 c=10 d=11 select=1xxx out=11
# mach at least two of then
# 140 a=00 b=01 c=10 d=11 select=xx11 out=00 //(2)----------------------------
# 160 a=00 b=01 c=10 d=11 select=x1x1 out=00
# 180 a=00 b=01 c=10 d=11 select=x111 out=00
# 200 a=00 b=01 c=10 d=11 select=1111 out=00
# ** Note: $finish : F:/IC/mux_casez/mux_casez_tb.v(35)
问题:
(1)处当select=4'bzzzz时,是满足4'b???1吗?
(2)处当select=4'bxx11时,应该同时可以满足两项,可是都只赋值了第一项,是只要有一个条件满足就不再判断吗?它是顺序执行的吗?从第一个条件开始逐个判断的吗?
(3)如果改casez为casex,是不是在(1)上一句out=00?
答案:
(1) 在casez语句, 当表达式的值为z时, 满足任何条件, 因此, select=4'bzzzz时, 满足4'b???1
(2) 在case, casez, casex语句中, 不同条件表达式可以彼此覆盖, 此时只有最上面一条语句被执行. 当select=4'bxx11时, 满足第一个条件, 4'b???1, 因此输出, 此时相当于优先编码器
(3) 在casex语句中, 当表达式的值为z,x时, 满足任何条件, 因此, select=4'bxxxx时, 满足4'b???1, 在20处输出out=00
不推荐使用casex语句, 因为x状态为仿真的初值, 容易引起误会. 另外, 建议无关项用?表示, 而不是x或者z.
以下是一个例子:
module mux_casez(out,a,b,c,d,select);
output [1:0] out;
input [1:0] a,b,c,d;
input [3:0] select;
reg [1:0] out;
always @(select or a or b or c or d)
begin
casez(select)
4'b???1: out = a;
4'b??1?: out = b;
4'b?1??: out = c;
4'b1???: out = d;
endcase
end
endmodule
//测试 文件-----------------------------------------------------------------------------------------
module mux_casez(out,a,b,c,d,select);
output [1:0] out;
input [1:0] a,b,c,d;
input [3:0] select;
reg [1:0] out;
always @(select or a or b or c or d)
begin
casez(select)
4'b???1: out = a;
4'b??1?: out = b;
4'b?1??: out = c;
4'b1???: out = d;
endcase
end
endmodule
//以下是输出结果---------------------------------------------------------------------------------------------
# 0 a=xx b=xx c=xx d=xx select=xxxx out=xx
# 20 a=00 b=01 c=10 d=11 select=xxxx out=xx
# 40 a=00 b=01 c=10 d=11 select=zzzz out=00 //(1)------------------
# 60 a=00 b=01 c=10 d=11 select=xxx1 out=00
# 80 a=00 b=01 c=10 d=11 select=xx1x out=01
# 100 a=00 b=01 c=10 d=11 select=x1xx out=10
# 120 a=00 b=01 c=10 d=11 select=1xxx out=11
# mach at least two of then
# 140 a=00 b=01 c=10 d=11 select=xx11 out=00 //(2)----------------------------
# 160 a=00 b=01 c=10 d=11 select=x1x1 out=00
# 180 a=00 b=01 c=10 d=11 select=x111 out=00
# 200 a=00 b=01 c=10 d=11 select=1111 out=00
# ** Note: $finish : F:/IC/mux_casez/mux_casez_tb.v(35)
问题:
(1)处当select=4'bzzzz时,是满足4'b???1吗?
(2)处当select=4'bxx11时,应该同时可以满足两项,可是都只赋值了第一项,是只要有一个条件满足就不再判断吗?它是顺序执行的吗?从第一个条件开始逐个判断的吗?
(3)如果改casez为casex,是不是在(1)上一句out=00?
答案:
(1) 在casez语句, 当表达式的值为z时, 满足任何条件, 因此, select=4'bzzzz时, 满足4'b???1
(2) 在case, casez, casex语句中, 不同条件表达式可以彼此覆盖, 此时只有最上面一条语句被执行. 当select=4'bxx11时, 满足第一个条件, 4'b???1, 因此输出, 此时相当于优先编码器
(3) 在casex语句中, 当表达式的值为z,x时, 满足任何条件, 因此, select=4'bxxxx时, 满足4'b???1, 在20处输出out=00
不推荐使用casex语句, 因为x状态为仿真的初值, 容易引起误会. 另外, 建议无关项用?表示, 而不是x或者z.