그동안은 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를 부를때에도 쉽게 변경 및 적용이 가능하다.

역시 나말고도 귀찮은걸 싫어 하는 사람이 많이 있었나보다.
저작자 표시 비영리
Posted by 영고니짱
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 문법도 모르고 시뮬레이션 코드작성법도 까먹고 난리났다.
그래도 코드 분석은 가능해서 다행인건가 ㅎㅎ;; 쪽팔리다 ㅡㅡ;
저작자 표시 비영리
Posted by 영고니짱

iice sampler -depth 32768 deviceram

Identify Script 를 생성하는데 sample Buffer의 depth 지정 방법이다.
deviceram 으로 할 경우 FPGA내에 존재하는 BlockRAM으로 할당이 된다.
behavioral 은 LUT를 사용한다고 하는데 - logic 으로 하면 머로 쓰는건지 모르겠다.

-depth 의 숫자와 Identify Signals 의 총 bit-width 를 곱한 값이
Block RAM의 여유공간이나 LUT보다 작아야만 합성 및 PnR 이 제대로 수행된다.

으~.. 쉘 스크립트 어렵다 @ @ vi 도 어렵고 @ @
저작자 표시 비영리
Posted by 영고니짱
리눅스에서 ISE 9.2i 를 실행하기 위해서는 반드시 2개의 환경변수가 등록이 되어야한다.

c-shell 기준으로 아래와 같은 환경 변수를 작성한다.


setenv XILINX {ISE 9.2i 설치경로}
setenv LD_LIBRARY_PATH $XILINX/bin/{platform}

10.1i을 동작할때는 필요없는 것 같다.
저작자 표시 비영리
Posted by 영고니짱
이전버튼 1 2 3 4 5 ... 17 이전버튼