혼자공부하는 Verilog_hdl_4

윤현식·2023년 5월 21일
0

Verilog_독학

목록 보기
4/5
post-thumbnail

Dataflow modeling(데이터플로우 모델링)

데이터 플로우 모델링 기법은 보다 효율적인 설계 구현 기법을 제공한다.
verilog는 데이터플로우 설계 기법을 적용하여 설계자로 하여금 레지스터들과 데이터 처리방법 간의 설계를 할 수 있도록 한다.

데이터플로우 수준의 설계로 부터 게이트 수준의 설계를 생성하여 주는것을 논리 합성(logic synthesis) 라고 한다.

Continuous assignment

연속 할당문은 데이터플로우 모델링 기법에 있어서 가장 기본이 되는 문장으로 하나의 값을 넷에 할당하는데 사용된다.

연속 할당문은 게이트 수준의 회로를 보다 추상화된 방법으로 서술하도록 하고 있다.

연속 할당문은 assign이라는 키워드로 시작하여 문법은 다음과 같다.

continous_assign :: = assign [신호강도][지연값]
					  list_of_net_assignments;
list_of_net_assignments ::= net_assignment{ ,net_assignment}
net_assignment ::= net_Ivalue  =expression

연속할당문의 특징

  1. 연속 할당문의 왼쪽은 항상 스칼라나 벡터의 넷, 도는 스칼라 넷과 벡터 넷으로 합쳐진 것이어야한다.
    왼쪽에는 스칼라나 벡터의 레지스터형은 올수 없다.

  2. 연속 할당문은 항상 능동적이다. 할당문은 항상 오른쪽 피연사자들의 값이 바뀌자마자 왼쪽의 넷에 값을 할당한다.

  3. 연산자의 오른쪽에 올 수 있는 것은 레지스터 또는 넷 도는 함수 호출문이다.
    레지스터 또는 넷은 스칼라나 벡터가 될 수 있다.

  4. 지연값은 할당문 안에서 단위 시간으로 지정된다. 지연값은 넷에 값을 할당할 때 걸리는 시간을 제어하기 위해 사용된다.
    이 특성은 게이트에 지연값을 할당 하는 것과 같은 특성이다.
    이것은 시간 지연을 고려한 회로를 설계할 때 매우 유용하다.

assign out = i1 & i2; // 연속 할당문 out, i1, i2은 넷이다.
 
assign addr[15:0] = addr1_bits[15:0]^addr2_bits[15:0]; // 벡터 넷 연속 할당문 addr는 16-비트 벡터 넷이다.

assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in; // 왼쪽은 스칼라 넷과 벡터 넷의 결합이다.

함축적 연속 할당문

verilog 내에서는 넷을 선언하고 연속 할당문을 통해 값을 할당하는 것 대신에 넷을 선언함과 동시에 연속 할당문을 사용하여 값을 할당할 수 있는 기능을 제공한다.

선언 시 하나의 넷에 대하여 단 한번의 할당문만을 허용한다.

다음은 연속 할당문의 일반적인 사용 방법과 함축적인 연속 할당문을 비교하고 있다.

wire out;
assign out = in1 & in2;

wire out = in1 & in2;

함축적 넷 선언

시그널 이름이 연속 할당문의 왼쪽에 사용되어 진다면 함축적 넷 선언은 시그널 이름을 암시하게 된다.

넷이 모듈 포트에 연결되어 있다면, 암시된 넷의 크기는 모듈 포트의 크기와 동일하다.

wire i1, i2;
assign out = i1 & i2; //wire로 선언되어지지 않은 것이 출력이다.

선언

지연 값은 오른쪽의 피연사자들의 값이 연산되어 왼쪽에 값을 할당할 때까지의 시간을 제어해 준다.

연속 할당문의 지연값을 서술하는 방법에는 정규 할당 지연, 함축적 연속 할당 지연, 그리고 넷 선언 지연의 세 가지 방법이 있다.

정규 할당 지연

첫 번째 방법은 연속 할당문에 지연값을 직접 할당하는 방법이다.

지연값은 키워드 assign 다음에 서술한다.

assign #10 out = in1 & in2 ; // 연속 할당문의 지연값 지정

in1 또는 in2의 값이 변하더라도 10만큼의 지연 시간이 지난 후에 in1 & in2를 계산하여 결과값을 out에 할당한다.

만약 in1 혹은 in2 중 어느 것이라도 10만큼의 지연 시간 이내에 값이 바뀐다면, 연산을 하는 순간에는 변경된 값으로 연산을 한다.

함축적 연속 할당 지연

wire #10 out = in1 & in2;

wire out ;
assign #10 out = in1 & in2;

넷 선언 지연

넷을 선언할 때 지연값을 연속 할당문을 사용하지 않고도 할당할 수 있다.

만약 우리가 넷 out에 일정한 지연값을 할당한다면, 어떠한 형태의 연속 할당문에서도 같은 지연시간이 걸릴 것이다.

넷 선언 지연은 게이트 수준 모델링에서도 같은 방식으로 사용된다.

wire #10 out;
assign out = in1 & in2;

wire out;
assign #10 out = in1 & in2;

수식, 연산자 그리고 피연산자

데이터 플로우 모델링은 프리미티브 게이트 수준의 설계가 아닌 수식에 의한 설계 방법이다.

수식, 연산자 그리고 피연산자는 데이터 플로우 모델링의 기본을 이룬다.

수식

수식은 결과를 산출해 내기 위한 연산자와 피연사자들의 조합으로 이루어진다.

a^b
addr1[20:17] + addr2[20:17]
in1 | in2

피연산자

피연산자는 상수, 정수, 실수, 넷, 레지스터, 시간, 특정비트, 특정부분 혹은 메모리, 함수, 호출이어야한다.

integer count, final_count;
final_count = count + 1; // count는 정수 피연산자이다.

real a,b,c;
c = a - b; // a와 b는 real형 피연산자.

reg [15:0] reg1, reg2;
reg [3:0] reg_out;
reg_out = reg1[3:0] ^ reg2[3:0];

reg ret_value;
ret_value = calculate_parity(A,bB); // calculate_parity는 함수형 피연산자이다.

연산자

연산자는 피연산자들과 함게 원하는 결과를 생성하는 역할을 한다. Verilog는 여러형태의 연산자를 제공한다.

조건 연산자

조건 연산자(?:)는 3개의 피연산자를 갖는다.

사용법 : 조건식? 참 조건시 수식 : 거짓 조건시 수식;

assign addr_bus = drice_anable ? addr_out : 36'bz;

assign out = control ? in1 : in0;

예제(4 : 1 멀티플렉서)

논리식을 활용한 설계

module mux4_to_1(out,i0,i1,i2,i3,s1,s0);

output out;
input i0,i1,i2,i3;
input s1,s0;

a/ssign out = (~s1 & ~s0 & i0) | (~s1 & s0 & i1) | (s1 & ~s0 & i2) | (s1 & s0 & i3);

en/dmodule

조건연산자를 활용한 설계

module multiplexer4_to_1(out,i0,i1,i2,i3,s1,s0);

output out;
input i0,i1,i2,i3;
input s1,s0;

assign out = s1 ? (s0 ? i3 : i2) : (s0 ? i1: i0);

endmodule
profile
Verilog, C, HW 개발

0개의 댓글