转自:http://www.edufujitsu.org/myspace/blog/show.php?id=169132
在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.
文章评论(0条评论)
登录后参与讨论