verilog 2001의 유용한 문법

설계 2010/01/22 10:47 Posted by 영고니짱
그동안은 verilog module 을 설계할 때
`define DATA_WIDTH 32

module test (
    input [`DATA_WIDTH -1:0]  d_in
);

위와 같은 방식으로 코딩을 하였다.

이런 방식의 문제는 상위 블록을 씌우거나 Test bench 를 작성할 때 instance를 위해 상위에도
같은 define을 적용해야 하는것인데, 이게 bit-width를 변경할 때마다 매번 수정하는 불편함이 있었다.

module test (
    d_in
);
parameter DATA_WIDTH = 32;

input [DATA_WIDTH -1 : 0] d_in;

그래서 위와 같은 방식을 사용하려 했으나 이것도 2번이나 port를 선언해야 하는 귀찮음이 있다.
verilog 2001에는 변경된 방식이 존재하는데
module test #(
    parameter DATA_WIDTH=32
)(
    input [DATA_WIDTH -1:0] d_int
);

이러한 코딩이 가능하다. 상위에서 instance를 부를때에도 쉽게 변경 및 적용이 가능하다.

역시 나말고도 귀찮은걸 싫어 하는 사람이 많이 있었나보다.
저작자 표시 비영리
C언어 같은 경우는 String 처리가 편하기 때문에 동적으로 파일을 읽어오거나 하는데 문제가 없는데,

Verilog 는 String 처리가 Bit 단위로 처리되기 때문에 공백 문제, align, 문제가 존재한다.

Verilog 2001 에는 $swrite라는 task 를 추가하여 String 처리를 보다 쉽게 만들어 준다.

웹서핑으로 찾았는데 정확한 Definition은 못찾았다.

C언어의 sprintf와 유사하다고 하길래 혹시나 하고 sprintf 문법처럼 사용했더니 된다.

$swrite (fname1,"STIMULUS/%0d_input_%0d.dat",`K,i);
$readmemh (fname1,mem_in);
위 사용법에 주의사항은 "%0d" 로 , C언어의 경우 %0d 는 Data type의 크기만큼 0을 채워준다.
그런데 Verilog에서는 %d로 하면 해당 data type만큼 공백이 생기고 (0이 생기는것이 아니라)
%0d 로 하게되면 공백이 없어진다. (0으로 채워지는것도 아닌것 같다.)

정확한 원리는 모르겠지만 하여튼 loop 안에서 동적으로 input 파일을 바꾸면서 입력이 가능하다.

verilog가 점점 프로그램 작성하기 쉽게 바뀐다.
여유가 된다면 System Verilog를 활용해보고 싶지만 개발일정을 맞추기까지 배워야 할것이 부담되어 당분간은 포기 ..

6개월 이상 Verilog 코딩을 안했더니 task 문법도 모르고 시뮬레이션 코드작성법도 까먹고 난리났다.
그래도 코드 분석은 가능해서 다행인건가 ㅎㅎ;; 쪽팔리다 ㅡㅡ;
저작자 표시 비영리
Assigning a literal to target '%s' bit or subrange results in slower compiled simulation code; 'or' ('and') variable with a mask '1' ('0') value(s) in the bit position(s) that you need to set (clear)

Instead of:
   r_b[15:8]<=8'h00;
use:
   r_b <= r_b & 24'hff00ff;


Assigning target '%s' subrange results in slower simulation code. Use concatenation instead.

Instead of:
   c_x[23:16] = r_a;
   c_x[15:8] = r_b;
   c_x[7:0] = r_c;
use:
   c_x = {r_a, r_b, r_c};

Instead of:
   c_ecc_out_1= cin[29] ^ cin[28] ^ cin[27] ^ cin[26] ^ cin[25] ^ cin[24] ^ cin[23] ^ cin[22] ^ cin[21] ^
                       cin[20] ^ cin[19] ^ cin[18] ^ cin[17] ^ cin[16] ^ cin[15] ^ cin[14] ^ cin[13] ^ cin[12] ^
                       cin[11] ^ cin[7] ^ cin[4] ^ cin[1] ^ cin[0];
use:
   c_ecc_out_l = ^ (c_in & 40'h003ffff893);


Simulation code for shift by constant is not as fast as simulation code for concatenation. Use concatenation instead.

Instead of:
   c_v = c_s << 8; // c_v, c_s are 48 bits wide
use
   c_v = { c_s [39:0], 8'h00 };


출처 : Principles of RTL design_2d

'설계' 카테고리의 다른 글

IEEE 802.11 VHT  (0) 2009/03/24
JOB의 계층구조?  (0) 2009/03/13
시뮬레이션 속도를 향상시키는 Verilog 코딩기법  (0) 2009/02/11
드디어 칩 테스트 끝...원인은?...  (0) 2008/12/04
결국 돌덩이네...  (0) 2008/11/18
드디어 칩이 나왔다. -_-;  (0) 2008/11/12

inout port 사용법

설계 2007/11/06 00:01 Posted by 영고니짱
자꾸 까먹는다. 까먹지말자!

module bidirec (oe, clk, inp, outp, bidir);
	// Port Declaration
	input   oe;
	input   clk;
	input   [7:0] inp;
	output  [7:0] outp;
	inout   [7:0] bidir;


reg [7:0] a; reg [7:0] b; assign bidir = oe ? a : 8'bZ ; assign outp = b; // Always Construct always @ (posedge clk) begin b <= bidir; a <= inp; end endmodule



output 은 enable 이 있을경우만 트리거 해주고, 평소에는 input 으로 사용한다.