verilog
case
문은 주어진 표현식이 목록의 다른 표현식 중 하나와 일치하는지 확인하고 그에 따라 분기합니다. 일반적으로 멀티플렉서를 구현하는 데 사용됩니다. if-else 구문은 확인해야 할 조건이 많고 멀티플렉서 대신 우선 순위 인코더로 합성되는 경우 적합하지 않을 수 있습니다.
Verilog 케이스 명령문은 case
로 시작합니다. 키워드이고 endcase
로 끝남 예어. 괄호 안의 표현식은 정확히 한 번 평가되고 작성된 순서대로 대안 목록과 비교되며 대안이 주어진 표현식과 일치하는 명령문이 실행됩니다. 여러 문의 블록은 그룹화되어야 하며 begin
내에 있어야 합니다. 및 end
.
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2,
case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default : <statement>
endcase
지정된 표현식과 일치하는 케이스 항목이 없으면 default
내의 명령문 항목이 실행됩니다. default
문은 선택 사항이며 default
는 하나만 있을 수 있습니다. case 문에 있는 문. Case 문은 중첩될 수 있습니다.
어떤 항목도 표현식 및 default
와 일치하지 않으면 실행은 아무 작업도 하지 않고 케이스 블록을 종료합니다. 설명이 제공되지 않습니다.
아래에 표시된 설계 모듈에는 3개의 다른 3비트 입력 중 하나를 호출된 출력 신호로 라우팅하는 2비트 선택 신호가 있습니다. case
문은 sel 값을 기반으로 출력에 올바른 입력을 할당하는 데 사용됩니다. sel은 2비트 신호이므로 2
2
를 가질 수 있습니다. 조합, 0 - 3. 기본 문은 sel이 3인 경우 출력을 0으로 설정하는 데 도움이 됩니다.
module my_mux (input [2:0] a, b, c, // Three 3-bit inputs
[1:0] sel, // 2-bit select signal to choose from a, b, c
output reg [2:0] out); // Output 3-bit signal
// This always block is executed whenever a, b, c or sel changes in value
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output is a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is anything else, out is always 0
endcase
end
endmodule
rtl 코드는 4:1 멀티플렉서를 나타내는 하드웨어 회로도를 얻기 위해 정교합니다.
<노스크립트>sel이 3일 때 출력이 0이고 다른 값에 대해 할당된 입력에 해당하는지 확인하십시오.
시뮬레이션 로그ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0 [10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5 [20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5 [30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1 [40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
case 문에서 비교는 표현식의 각 비트가 0, 1, x 및 z를 포함한 대안 중 하나와 일치할 때만 성공합니다. 위의 예에서 sel의 비트 중 하나라도 x 또는 z이면 default
일치하는 다른 대안이 없기 때문에 문이 실행됩니다. 이 경우 출력은 모두 0이 됩니다.
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
디자인의 case 문에 case item 대안에 x와 z가 있으면 결과가 상당히 달라집니다.
module my_mux (input [2:0] a, b, c,
[1:0] sel,
output reg [2:0] out);
// Case items have x and z and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz : out = a;
2'bzx : out = b;
2'bxx : out = c;
default : out = 0;
endcase
end
endmodule
시뮬레이션 로그 ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5 ncsim: *W,RNQUIE: Simulation is complete.
case
명령문이 if-else-if
와 다릅니다. 두 가지 방법으로:
if-else
에 제공된 표현 블록은 case
에 있는 동안 더 일반적입니다. 블록에서 단일 표현식이 여러 항목과 일치합니다.case
표현식에 X 및 Z 값이 있을 때 최종 결과를 제공합니다.verilog
매개변수는 다른 사양으로 모듈을 재사용할 수 있도록 하는 Verilog 구성입니다. 예를 들어, 4비트 가산기는 비트 수에 대한 값을 허용하도록 매개변수화될 수 있으며 모듈 인스턴스화 중에 새 매개변수 값이 전달될 수 있습니다. 따라서 N비트 가산기는 4비트, 8비트 또는 16비트 가산기가 될 수 있습니다. 함수 호출 중에 전달되는 함수에 대한 인수와 같습니다. parameter MSB = 7; // MSB is a parameter with a constant value 7 paramet
Verilog는 하드웨어 설명 언어이며 설계자가 RTL 설계를 시뮬레이션하여 논리 게이트로 변환할 필요가 없습니다. 시뮬레이션이 필요한 이유는 무엇입니까? 시뮬레이션은 RTL 코드가 의도한 대로 동작하는지 확인하기 위해 다른 시간에 다른 입력 자극을 설계에 적용하는 기술입니다. 기본적으로 시뮬레이션은 설계의 견고성을 검증하기 위해 잘 따라야 하는 기술입니다. 또한 가공된 칩이 실제 세계에서 사용되는 방식과 다양한 입력에 반응하는 방식과 유사합니다. 예를 들어, 위의 디자인은 출력 pe 보여진 바와 같이. 시뮬레이션을 통해