본문 바로가기

Verilog 를 사용하는 할당 구문은 크게 =, <=  2개를 많이 사용하는데 헷갈릴까봐 일단 정리

 

Continuous Assigns

assign a = b & c;

 

혹은 딜레이 요소를 넣어서 (물론 딜레이는 합성이 되지 않는다)

assign #10 a = b & c;

 

Procedural Assignment

always 문이나 initial 문 안에서 사용되는 할당 문이다.

일단 2가지가 있다. blocking, non-blocking 일단 머 하드웨어의 기본은 non-blocking 이다.

C 코드가 아니므로, 순차적 실행은 존재할 수 없다.

blocking 은 대부분 그냥 combinational 회로로 대체되고, non-blocking 은 F/F, Latch 가 사용된다고 보면 된다.

 

A procedural assignment updates the value of register data types.
Syntax:
[ delay ] register_name = [ delay ] expression;     // blocking
[ delay ] register_name <= [ delay ] expression;    // non-blocking

always @(a or b or c or d)
   y = (a | b) & (~c ^ d);
   
always @* begin
   y = (a | b) & (~c ^ d);
   z = (e | f) & (~g ^ h);
end

예제

https://www.hdlworks.com/hdl_corner/verilog_ref/items/ProceduralAssignment.htm

https://verilogams.com/refman/modules/discrete-processes.html

begin
  a = 0;
  #10 a = 1;
  #5 a = 2;
end             // time 0: a=0; time 10: a=1; time 15 (#10+#5): a=2;

begin
  a <= 0;
  #10 a <= 1;
  #5 a <= 2;
end            // time 0: a=0; time 5: a=2; time 10: a=1;

begin
  a <= b;
  b <= a;
end            // both assignments are evaluated before a or b changes

주의할 점

assign (좌변) = (우변) ; 꼴로 작성을 하게 되는데 좌변에는 항상 wire type 변수만이 올 수가 있습니다.

reg는 assign 문의 우변에는 올 수 있지만 좌변에 올 수 없습니다.

 

hdl 설명자료

 

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.