ためになるホームページ お問い合わせ




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.