TOP > Verilog > case文 |
case文
case文は、C言語でいうとswitchと同等の判定処理である。caseからはじまり、endcaseで終わる。case文は、"x"、"z"を含めて一致を比較する。比較する信号や、各caseラベルに"x"や"z"が含んだ場合でも、全てが一致した場合のみ実行される。
(書式)
case (信号名)
信号名の値: 処理;
信号名の値: 処理;
endcase
case文の記述の例
///////////////////////////////////////////////////////////////////////////////// //TESTBENCH // テストベンチ ///////////////////////////////////////////////////////////////////////////////// module TESTBENCH; reg CLK, RES; reg [1:0] SEL; wire[1:0] XOUT; parameter STEP = 10; // クロックの定義 always #(STEP/2) CLK = ~CLK; CASETEST CASETEST(CLK, RESET, SEL, XOUT); initial begin $dumpfile("test.vcd"); $dumpvars(0, TESTBENCH); $monitor ("%t: RES = %b, SEL = %h, XOUT = %h", $time, RES, SEL, XOUT); CLK = 0; #(STEP/2); #STEP RES = 0; #STEP RES = 1; #STEP SEL = 0; #STEP SEL = 1; #STEP SEL = 2; #STEP SEL = 3; #(STEP * 2); $finish; end endmodule ///////////////////////////////////////////////////////////////////////////////// //begin ///////////////////////////////////////////////////////////////////////////////// module CASETEST(CLK, RES, SEL, XOUT); input CLK, RES; input[1:0] SEL; output [1:0]XOUT; reg [1:0]XOUT; always@(posedge CLK) begin if (!RES) XOUT <= 0; else begin case (SEL) 2'b01 : XOUT <= 1; 2'b10 : XOUT <= 2; 2'b11 : XOUT <= 3; default : XOUT <= 0; endcase end end endmodule casex文/casez文
casex文は、"x”や"z"を比較対象外(don't care)として使用できる。casez文は、"z"のみを比較対象外とすることができる。
casex文の記述の例
///////////////////////////////////////////////////////////////////////////////// //TESTBENCH // テストベンチ ///////////////////////////////////////////////////////////////////////////////// module TESTBENCH; reg CLK, RES; reg [1:0] SEL; wire[1:0] XOUT; parameter STEP = 10; // クロックの定義 always #(STEP/2) CLK = ~CLK; CASETEST CASETEST(CLK, RESET, SEL, XOUT); initial begin $dumpfile("test.vcd"); $dumpvars(0, TESTBENCH); $monitor ("%t: RES = %b, SEL = %h, XOUT = %h", $time, RES, SEL, XOUT); CLK = 0; #(STEP/2); #STEP RES = 0; #STEP RES = 1; #STEP SEL = 0; #STEP SEL = 1; #STEP SEL = 2; #STEP SEL = 3; #(STEP * 2); $finish; end endmodule ///////////////////////////////////////////////////////////////////////////////// //begin ///////////////////////////////////////////////////////////////////////////////// module CASETEST(CLK, RES, SEL, XOUT); input CLK, RES; input[1:0] SEL; output [1:0]XOUT; reg [1:0]XOUT; always@(posedge CLK) begin if (!RES) XOUT <= 0; else begin casex (SEL) 2'b01 : XOUT <= 1; 2'b1x : XOUT <= 2; default : XOUT <= 0; endcase end end endmodule |
Copyright 2007 ためになるホームページ All Rights Reserved. |