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
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
[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
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