행위수준 모델링
- 조합논리회로와 순차논리회로의 설계, 설계된 회로의 시뮬레이션을 위한 테스트벤치의 작성에 사용
- always 구문, initial 구문, task, function 내부에 사용
always 구문
always [@(sensitivity_list)] begin
blocking_or_nonblocking statements;
end
@(sensitivity_list)는 always문의 실행을 제어
- sensitivity_list (감지신호목록)에 나열된 신호들 중 하나 이상에 변화(event)가 발생했을 때 always 내부에 있는 begin-end 블록의 실행이 트리거 됨
- begin-end블록은 절차형 문장들로 구성
- blocking 할당문 또는 nonblocking 할당문에 따라 실행 방식이 달라짐
- 시뮬레이션이 진행되는 동안 무한히 반복 실행됨
always 구문의 sensitivity_list(감지신호목록)
- 조합논리회로 모델링
- always 구문으로 모델링되는 회로의 입력 신호가 모두 나열되어야 함
- 일부 신호가 감지신호목록에서 빠지면, 합성 이전의 RTL 시뮬레이션 결과와 합성 후의 시뮬레이션 결과가 다를 수 있음
- 함축적 감지신호 표현(@*)을 사용 가능
- 순차회로 모델링
- 동기식 셋/리셋을 갖는경우 : 클록신호만 포함
- 비동기식 셋/리셋을 갖는경우 : 클록신호, 셋, 리셋신호를 포함
always @ (*) // equivalent to @( a or b or c or d or f) y = ( a & b ) | ( c & d ) | f : |
always 구문이 테스트벤치에 사용되는 경우
- 시뮬레이션 시간의 진행에 관련된 제어가 포함되어야 함
- 그렇지 않으면 zero-delay 무한 루프가 발생되어 교착상태에 빠지게 되어 시뮬레이션이 진행되지 않음
always clk = ~clk; // zero-delay infinite loop 한순간에 계속 바뀌게 되는 무한루프 |
always #20 clk = ~clk // 20초 지연마다 값을 바꿔줌 |
initial 구문
initial 구문
initial begin blocking_or_nonblocking statements ; end |
- 시뮬레이션이 실행되는 동안 한번만 실행
- 절차형 문장들로 구성되며, 문장이 나열된 순서대로 실행
- 논리합성이 지원되지 않으므로 시뮬레이션을 위한 테스트벤치에 사용
절차형 할당문
- reg, integer, time, real, realtime 자료형과 메모리 변수에 값을 갱신
- 문장이 나열된 순서대로 실행되어 할당문 좌변의 변수 값을 갱신하는 소프트웨어적 특성 연속할당 : 피연산자 값에 변화(event)가 발생할 때마다 우변의 식이 평가되고, 그 결과 값이 좌변의 net를 구동하는 하드웨어적 특성
- Blocking 할당문 >> 할당기호 = 을 사용
- Nonblocking 할당문 >> 할당기호 <= 을 사용
a=0; b=1; nonblocking a<=b; // a=0, b=1을 잡아놓은 후 할당하기 때문에 b<=a; // 결과는 a=1 , b=0 |
a=0; b=1; blocking a = b; // a = 1; b = a; // b = a = 1; |
shift 레지스터의 예 ) 값을 하나씩 오른쪽으로 넘겨줄 때 nonblocking으로 해야 의도 대로 작동
nonblocking module_block_vs_nonblock( input d, input clk, output [3:0] q, output [3:0] r ); reg [3:0] q; reg [3:0] r; always @ (posedge clk) begin // blocking , 의도 대도 작동 x q[3]=d; // q[3] = q[2] = q[1] = q[0] q[2]=q[3]; q[1]=q[2]; q[0]=q[1]; end always @ (posedge clk) begin // nonblocking , 의도대로 작동 o r[3]<=d; r[2]<=r[3]; r[1]<=r[2]; r[0]<=r[1]; end endmodule |
아래는 위 코드를 실행하기 위한 테스트벤치 파일
module tb_b_nb; reg d; reg clk; wire [3:0] q; wire [3:0] r; block_vs_nonblock uut ( // 위에서 만든 블록 가져와서 사용 .d(d) , // port d에 보낼 신호이름을 d .clk(clk) , .q(q) , .r(r) ); initial begin d=0; clk=0; #70; d=1; #150; d=0; #70; d=1; #70 d=0; #200; d=1; #300; end always #50 clk = ~clk; endmodule |
if조건문
if( expression )
statement_true;
[else
statement_false;]
- 조건식이 참이면, statement_true 부분 실행
- 조건식이 거짓이면 (0,x,z)이면, statement_false 부분 실행
- else 부분이 없으면, 변수는 이전에 할당 받은 값을 유지 (latch 동작)
- if문의 내포(nested) (if문 내부에 또 다른 if 있는경우) >> 들여쓰기 또는 begin - end로 명확하게 표현
case문
case (조건식)
case_item : 문장;
default : 문장;
endcase
- case 조건식의 값과 일치하는 case_item의 문장이 실행
- 각 비트가 0, 1, x, z를 포함하여 정확히 같은 경우에만 일치로 판단
- case 문의 조건식과 모든 case_item의 비트 크기는 큰 쪽에 맞추어져야함
- 모든 case_item들에 대한 비교에서 일치되는 항이 없는 경우에는 default항이 실행
- default항이 없으면 변수는 이전에 할당받은 값을 유지
- don't care를 갖는 case문
- casez문 : z를 don't-care로 취급하여 해당 비트를 비교에서 제외 > 조건으로 ? 기호 사용 가능
- casex문: x를 don't-care로 취급하여 해당 비트를 비교에서 제외
반복문
- forever 문 : 문장이 무한히 반복적으로 실reapeat 문 : 지정된 횟수만큼 문장이 반복 실행
- repeat 문 : 지정된 횟수만큼 문장이 반복 실행 >> 반복 횟수를 나타내는 수식이 x or z로 평가되면 반복횟수는 0이 되고 문장은 실행되지 않음
- while 문 : 조건식의 값이 거짓이 될 때 까지 문장이 반복 실행 >> 조건식의 초기값이 거짓이면 문장은 실행되지 않음
- for 문 : 반복 횟수를 제어하는 변수에 의해 문장이 반복 실행
forever statement;
| repeat(조건식) 문장;
| while(조건식) 문장;
| for(varialbe_assign); expression; variable_assign) statement;
Verilog HDL 개요 , 회로설계 모델링, 어휘 규칙
Verilog HDL 구문 논리 합성용 구문 assign, if ~ else , case , for , always 대부분의 논리합성 툴에서 게이트 수준 합성을 지원하는 구문들이다. Simulation용 구문 initial , $finish , $fopen 시뮬레이션을 위한 테스
jjikky-code.tistory.com
Verilog 연산자
1100 && 0101 : 논리 and (이항 연산자) > 0,x,z가 아닌 정해진 값이면 1 , 1 and 1이 되서 값은 1 1100 & 0101 : 비트단위 and > 위치가 같은 비트 끼리 and 연산 , 결과는 0100 & 1100 : 축약 and (단항 연산자) > 모든
jjikky-code.tistory.com
Verilog 자료형
Verilog의 논리값 논리값 의미 0 logic zero , or false condition 1 logic one, or true condition x unknown logic value z high - impedance state Verilog HDL의 자료형 Net 자료형 : 소자간의 물리적인 연결을 추상화 논리 게이트나
jjikky-code.tistory.com
게이트 수준 Modeling
게이트 및 스위치 프리미티브 predefined 프리미티브 정의나 선언 없이 사용 가능 단일 출력을 가짐 모듈 내에서만 사용 가능 >> initial 과 always 구문 내부에서는 사용 불가 게이트 프리미티브 인스
jjikky-code.tistory.com
할당문
연속할당문 : net형 객체에 값을 할당 assign문 continous_assign :: = assign [driving_strength][delay] net_assignments; 절차형 할당문 : variable형 객체에 값을 할당 always 블록, initial 블록, task, function 내부의 할당문 b
jjikky-code.tistory.com
행위수준 모델링
행위수준 모델링 조합논리회로와 순차논리회로의 설계, 설계된 회로의 시뮬레이션을 위한 테스트벤치의 작성에 사용 always 구문, initial 구문, task, function 내부에 사용 always 구문 always [@(sensitivity_
jjikky-code.tistory.com
'study > Logic Circuit' 카테고리의 다른 글
할당문 (0) | 2020.10.25 |
---|---|
게이트 수준 Modeling (0) | 2020.10.10 |
Verilog 연산자 (0) | 2020.10.10 |
Verilog 자료형 (0) | 2020.10.08 |
Verilog HDL 개요 , 회로설계 모델링, 어휘 규칙 (0) | 2020.10.07 |