본문 바로가기

2-2/디지털 설계 및 실험

[디지털 설계 및 실험] Verilog 기본 vol 6. dataflow modeling

이번 포스팅에서는 Verilog의 설계 단계중 하나인 dataflow modeling을 알아보자.

 

 

 

 

💻 Continuous Assignments

dataflow modeling에서 할당을 하는방법은 2가지가 있는데, 그중 하나인 연속 할당이다.

 

쉽게 말하면 net형 객체에 값을 할당하는 구문이다.

assign out = i1 & i2; //out is a net. i1 and i2 are nets.

//addr is a 16-bit vector net, add1 and add2 are 16-bit vector registers
assign addr[15:0] = addr1_bits[15:0] ^ add2_bits[15:0];

 

continuous assignment 연속 할당문은 assign 문을 통해 net형 객체에 값을 할당하는 것이다. 

항상 Left Hand side(LHS)는 스칼라나 벡터 넷타입이 되야한다. 절대 reg 타입은 되어서 안된다.

Right Hand side(RHS)는 register나 net이나 함수호출이 될 수 있다.

delay 값들은 할당과 함께 명시될 수 있다.

 

 

연속 할당에는 두가지 종류가 있다.

 

1) 명시적 연속 할당문

wire out; // 1.wire 선언
assign out = in1 & int2; // 값을 갖다 넣어라.

 

2) Implicit continuous assignment(암시적 연속 할당문)

wire out = in1 & in2;

암시적 연속 할당문으로 net형 객체에 값을 할당한 것이다.

위에 명시적 연속 할당문에서 한 할당과 같은 효과를 낸다. 

그러나 교수님께서는 웬만하면 위 명시적 연속 할당문을 사용하는 것을 추천하였다.

 

wire i1, i2;
assign out = i1 & i2;

이와 같이 out의 타입형을 적지 않아도 wire로 자동으로 선언되어진다.

이것은 verilog에선 괜찮지만 c에서는 에러난다. 따라서, 확실한 선언이 추천되어진다.

 

 

💻 Gate Delay

net형 객체에 값을 할당하면서 delay value도 같이 할당해 줄 수 있다.

assign #10 out = in1 & in2;

그러기 위해 제안된 것이 Inertial delay(관성지연) 이다.

딜레이를 10초 해주는것이다. 10초보다 pulse가 작으면, 노이즈로 인식한다.

위 코드에서 in1,in2 입력신호가 delay보다 pulse 폭이 작으면 노이즈로 인식하여 연산에 영향을 미치지 못한다.

Inertial delay는 노이즈로 판단할 기준으로 사용된다.

 

 

위 그림에서 ? 부분은 out에 걸린 inertial delay인 10보다 작기 때문에 노이즈로 인식되어 연산에 영향을 끼치지 못한다.

 

 

💻 산술 연산

1)Binary operator

두개의 피연산자가 사용된다.

기본적인 사칙연산에 나머지계산인 %와 제곱계산인 power(**)가 있다.

power계산을 해보면 a ** b = a^b가 계산이 된다. a의 b승이라는 뜻이다.

 

in1 = 4'b101x;
in2 = 4'b1010;
sum = in1 + in2;

위와 같은 계산이 있다면

in1의 값이 확실히 정해져 있는 것이 아니므로

sum은 4'bx가 된다.

 

-7 % 2 // Evaluates to -1
7 % 2 // Evaluates to 1

나머지 계산의 결과값은 피연산자에 절대값을 씌우고 계산한 뒤 앞에 나눠지는 수의 부호를 따라가면 된다.

 

2) Unary operators 

하나의 피연산자만이 사용된다.

-4 // negative 4
+5 // positive 5

숫자 앞에 -,+을 붙여서 부호를 정해줄 수 있다. 연산자 우선순위에서 아주 높은 위치에 있다.

 

-10 /5  //Evaluates to -2

-'d10 / 5 // 이것은 (10의 2의보수)/5와 같다. (2^32 - 10)/5

주의할점은 integer이나 real numbers에만 사용해야한다는 점이다.

<sss>'<base><nnn>의 형태로 사용되어진 음수를 나누게 되면 unsigned 2의보수로 바뀌어 연산되어진다.

signed 레지스터나 넷을 사용하자!

 

 

나머지 짜잘구리한거 너무많아서

정리하다가 시간 다가겠다.  제일 중요한 개념들만 넣어놨으니 참고하자.