case

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова case ΠΈ заканчиваСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом endcase. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² скобках Π±ΡƒΠ΄Π΅Ρ‚ вычислСно ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΎ сравниваСтся со списком Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ записаны, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° соотвСтствуСт Π΄Π°Π½Π½ΠΎΠΌΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

Если Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтов case Π½Π΅ соотвСтствуСт Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ инструкции Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнта default. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ case ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ.

Бинтаксис

case (<expression>)
  case_item1 :  <single statement>
  case_item2,
  case_item3 :  <single statement>
  case_item4 :  begin
                  <multiple statements>
                end
  default    : <statement>
endcase

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

module mux_(input [2:0]  a, b, c, input [1:0]  sel, output reg [2:0]  out); 
  always @(*) begin
    case(sel)
      2'b00   : out = a;     
      2'b01   : out = b;     
      2'b10   : out = c;     
      2'bz    : out = 3'bz;   
      2'bx    : out = 3'bx;   
      default : out = 0;     
    endcase
  end
endmodule

module case_tb;
  reg [2:0] aa, bb, cc, d;
  reg [1:0] sel;

  mux_ mux(aa, bb, cc, sel, d);
  initial begin
    $display("Time\t a \t b \t c \tout\tsel");
    $monitor("[%2t]\t%b\t%b\t%b\t%b\t%b", $time, aa, bb, cc, d, sel);
    #10 bb = 0; cc = 1;
    #10 sel = 0;
    #10 aa = 1;
    #10 sel = 1;
    #10 sel = 2;
    #10 cc = 2'bz;
    #10 sel = 5;
    #10 sel = 2;
    #10 sel = 2'bz;
    #10 sel = 2'bx;
  end
endmodule

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния

Time     a   b   c  out sel
[ 0]    xxx xxx xxx xxx xx
[10]    xxx 000 001 xxx xx
[20]    xxx 000 001 xxx 00
[30]    001 000 001 001 00
[40]    001 000 001 000 01
[50]    001 000 001 001 10
[60]    001 000 0zz 0zz 10
[70]    001 000 0zz 000 01
[80]    001 000 0zz 0zz 10
[90]    001 000 0zz zzz zz
[100]   001 000 0zz xxx xx

casex/casez

ΠžΡΠΎΠ±Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ case: casex ΠΈ casez. Оба ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для упрощСния условных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π·Π° счСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… условных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ различия:

  • case : Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ сравнСниС всСх Π±ΠΈΡ‚ (1, 0, x, z)

  • casez: ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ z (1, 0, x)

  • casex: ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ x, ΠΈ z (1, 0)

? – символ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚Π° Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ casex/casez/case

module cases;
  reg [3:0] my_input;
  reg [7:0] my_output;
  initial begin
    $monitor("[%02t] %04b %d", $time, my_input, my_output);
    my_input = 0;
    #15; my_input = 4'b000x; #1; $finish;
  end
  always @(my_input) begin
    case(my_input)
      4'b000? : my_output = 8'd0;
      4'b001? : my_output = 8'd1;
      4'b1??0 : my_output = 8'd2;
      4'b???x : my_output = 8'dx;
      default : my_output = 8'hFF;
    endcase
  end
  always #1 my_input++;
endmodule
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния case
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния casex
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния casez
[00] 0000 255
[01] 0001 255
[02] 0010 255
[03] 0011 255
[04] 0100 255
[05] 0101 255
[06] 0110 255
[07] 0111 255
[08] 1000 255
[09] 1001 255
[10] 1010 255
[11] 1011 255
[12] 1100 255
[13] 1101 255
[14] 1110 255
[15] xxxx 255
[00] 0000 255
[01] 0001 255
[02] 0010 255
[03] 0011 255
[04] 0100 255
[05] 0101 255
[06] 0110 255
[07] 0111 255
[08] 1000 255
[09] 1001 255
[10] 1010 255
[11] 1011 255
[12] 1100 255
[02] 0010   1
[03] 0011   1
[04] 0100   x
[05] 0101   x
[06] 0110   x
[07] 0111   x
[08] 1000   2
[09] 1001   x
[10] 1010   2
[11] 1011   x
[12] 1100   2
[13] 1101   x
[14] 1110   2
[15] xxxx   0
[00] 0000   0
[01] 0001   0
[02] 0010   1
[03] 0011   1
[04] 0100 255
[05] 0101 255
[06] 0110 255
[07] 0111 255
[08] 1000   2
[09] 1001 255
[10] 1010   2
[11] 1011 255
[12] 1100   2
[13] 1101 255
[14] 1110   2
[15] xxxx   x

unique/priority

Π’ SystemVerilog Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ unique ΠΈ priority:

  • unique-case

  • unique0-case

  • priority-case

Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ условия совпадаСт с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Если совпадаСт Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ - гСнСрируСтся ошибка ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

Аналогично unique-if ΠΈ unique0-if unique0-case Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ прСдупрСТдСния/ошибки.

module main;
   logic [1:0] counter = 2'b00;
   logic       clk = 1'b0;

   initial forever #1 clk <= ~clk;

   always @(posedge clk) begin
      counter <= counter + 2'd1;

      unique case (counter)
      2'd0: $display("case 0 [%0t] %d", $time, counter);
      2'd1: $display("case 1 [%0t] %d", $time, counter);
      4'b01: $display("case 1b [%0t] %d", $time, counter);
      2'd3: $display("case 3 [%0t] %d", $time, counter);
      endcase
      // 2'd2: отсутствуСт - Π±ΡƒΠ΄Π΅Ρ‚ warning/error

      if (counter == 2'd3) begin
         $display("PASSED");
         $finish(0);
      end
   end
endmodule

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния unique-case

case 0 [1] 0
case 1 [3] 1
WARNING: test.sv:12: value is unhandled for priority or unique case statement
         Time: 5  Scope: main
case 3 [7] 3
PASSED

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния unique0-case

case 0 [1] 0
case 1 [3] 1
case 3 [7] 3
PASSED

priority-case Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ условия совпадаСт с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ВыполняСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

module main;
   logic [1:0] counter = 2'b00;
   logic       clk = 1'b0;

   initial forever #1 clk <= ~clk;

   always @(posedge clk) begin
      counter <= counter + 2'd1;

      priority case (counter)
            3'b1??: $display("case 3 [%0t] %d", $time, counter);
            3'b01?: $display("case 2 [%0t] %d", $time, counter);
            3'b001: $display("case 1 [%0t] %d", $time, counter);
      endcase

      if (counter == 2'd3) begin
         $display("PASSED");
         $finish(0);
      end
   end
endmodule

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния priority-case

WARNING: test.sv:12: value is unhandled for priority or unique case statement
         Time: 1  Scope: main
case 1 [3] 1
WARNING: test.sv:12: value is unhandled for priority or unique case statement
         Time: 5  Scope: main
WARNING: test.sv:12: value is unhandled for priority or unique case statement
         Time: 7  Scope: main
PASSED

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния case

case 1 [3] 1
PASSED

Last updated