原创 verilog学习笔记【casez赋值问题】

2010-7-6 15:45 2199 0 分类: FPGA/CPLD

转自: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.

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
0
关闭 站长推荐上一条 /3 下一条