혼자공부하는 Verilog_hdl_4

윤현식·2023년 5월 21일
0

Verilog_독학

목록 보기
5/5
post-thumbnail

행위수준 모델링(Behavioral modeling)

구조적 프로시저

verilog에는 두 가지 구조적 프로시저 always와 initial이 있다.

이 두 문장은 행위 수준 모델링에서 가장 기본적인 문장이다.

initial 구문

initial문 내부의 모든 문장들이 initial 블록을 구성한다.

initial 블록은 시간 0에서 시작하고, 시뮬레이션동안 한 번만 수행되고, 다시는 수행되지 않는다.

만약 여러개의 initial 블록이 있으면, 각 블록은 시간 0에서 동시에 수행되고, 다른 블록과 상관없이 독립적으로 실행을 마친다.

여러 개의 행위 수준 문장은 반드시 키워드 begin과 end문을 사용해서 묶어야 한다.

module stimulus;
reg x,y,a,b,m;

initial
	m = 1'b0;
initial
begin
	#5 a = 1'b1;
    #25 b = 1'b0;
    
end

initial
begin
	#10 x = 1'b0;
    #25 y = 1'b1;
end

initial
	#50 $finish;
endmodule

initial 블록은 일반적으로 초기화, 모니터링, 파형, 그리고 전체 시뮬레이션 수행 시 단 한번만 수행되어야 하는 과정에 사용된다.

always 구문

always 문장은 시간 0에서 시작하고, 블록 내의 문장을 루프 형식으로 연속되게 수행한다.

이 문장은 디지털 회로의 연속적으로 반복되는 활동의 블록을 모델링하기 위해 사용된다.

module clock_gen(output reg clock);

initial
	clock = 1'b0;

always
	#10 clock = ~clock ;
    
initial
	#1000 $finish;
endmodule

절차적 할당

절차적 할당(procedural assignments)은 reg,integer,real 또는 time 변수의 값을 갱신한다.

변수에 할당된 값은 절차적 할당 방법으로 다른 값이 갱신되기 전까지 변치 않고 유지된다.

연속적 할당은 오른쪽 표현식의 값을 왼족 넷에 연속적으로 할당한다.

assignment ::= variable_Ivalue = [delay_or_event_control]
	expression

Blocking assignment

블로킹 문장은 순차적 블록에 열겨된 순서대로 수행된다.

블로킹 문장은 병렬 처리 블록 내의 문장이 실행되는 것을 허용한다.

reg x,y,z;
reg [15:0] reg_a, reg_b;
integer count;

initial 
begin
    x = 0;
    y = 1;
    z = 1; // 스칼라 할당

    count = 0; // 정수 변수의 할당
    reg_a = 16'b0;
    reg_b = reg_a;

    #15 reg_a[2] = 1'b1; //지연을 가지고 있는 비트 선택 할당.
    #10 reg_b[15:13] = {x,y,z}; // 벡터의 부분적 선택에 연결의 결과를 할당.
    count = count + 1; // 정수의 할당.(증가)
end

Non_blocking assignment

논블로킹은 순차적 블록 내 앞선 문장이 끝나지 않아도 할당 스케쥴링을 할 수 있게 해준다.

<= 연산자는 논블로킹 할당을 지정하는데 사용된다.

<= 연산자가 수식에서 사용되면 관계연산자로 해석되고,

논블로킹 할당의 문맥에서는 할당 연산자로 해석된다.

논블로킹 할당 응용

always @(posedge clock)
begin
	reg1 <= #1 in1;
    reg2 <= @(negedge clock) in2^in3;
    reg3 <= #1 reg1 ;

타이밍 제어

타이밍 제어는 절차적 문장이 수행되는 시뮬레이션 시간을 지정하는 방법이다.

타이밍 제어에는 3가지 방법이 있다.

지연 기반 타이밍 제어

지연은 기호 #에 의해서 지정된다.

지연 기반 타이밍 제어는 숫자, 식별자에 의해서 지정된다.

절차적 할당을 위한 제어에는 세가지 형대가 있다.

  1. 정규 지연제어
  2. 내부 할당 지연 제어
  3. 제로 지연 제어

정규 지연 제어

정규 지연 제어는 절차적 할당의 왼쪽에 0값이 아닌 지연이 지정될 때 사용한다.

parameter latency = 20;
parameter delta = 2;

reg x,y,z,p,q;

initial
begin
	x = 0;
    #10 y = 1;
    #latency z = 0;

내부 할당 지연 제어

지연 제어를 할당의 왼쪽에 지정하는 대신에, 할당 연산자의 오른쪽에 지연을 할당 할 수 있다.

사건 기반 타이밍 제어

사건은 레지스터 또는 넷의 값 변화를 의미한다.

사건은 문장 또는 문장의 블록 구동을 위해 사용될 수 있다.

사건 기반 타이밍 제어에는 4가지 형태가 있다.

정규 사건 제어

@ 기호는 사건 제어를 지정하는데 사용된다.

문장은 신호값 또는 신호값의 양 또는 음으로 변화될 때 수행된다.

@(clock) q  = d; // 클럭이 변할 때마다 수행된다.

@(posedge clock) q = d; // 클럭이 상승 변환을 할 때마다 수행된다.

q = @(posedge clock) d; // 클럭의 상승 모서리에서 현재 d값을 구하고 q로 할당된다.

명명된 사건 제어

명명된 사건은 키워드 event에 의해 선언된다.

사건은 -> 기호에 의해 구동된다.

사건 OR 제어

always @( reset or clock or d)

콤마 연산자를 가진 감지 목록

always @(reset, clock, d)
profile
Verilog, C, HW 개발

0개의 댓글