IT Devel

[정리] Verilog 배열관련

ARM(SoC,FPGA)

참고 : http://blog.naver.com/beahey/90192889480


배열 선언은

reg [7:0] a[3];

이렇게 한다. 앞쪽의 "[7:0]"는 배열을 표현보다는 버스의 비트를 나타내고,

배열을 뒤쪽의 "[3]" 으로 보고 이해하는 것이 쉽다.

즉 위의 예는 8비트짜리 배열 3개을 가지고 있다는 의미


또한 중요한 것은 포트로 뽑아낼 수가 없다는 엄청 불편한 진실..

즉 module의 input/output으로 쓰기 곤란하다는..

구체적인 예는 위 참고 사이트 참조


짤은 "Array" ㅋ


array
array by OiMax 저작자 표시


[verilog] `timescale 1ns/10ps 의미

ARM(SoC,FPGA)

이것도 검색으로 펌질, 여타 설명이 필요없는 간결한 자료

`timescale 1ns/10ps

앞에 숫자는 해당 파일내에서 쓰이는 숫자들의 단위를 나타냄..즉 #2 이렇게 쓰여있다면 2ns를 나타냄

뒤의 숫자는 시뮬레이터에서 많이 쓰일 것 같은데 코딩에서는 별 효과가..무튼 소수점을 허용하려면 어디까지 해야할까를 나타내야 하는데 그 때 쓰이는 최소 단위

설명은 아래 참고.


[출처] [verilog] timescale에 대하여|작성자 j0hnch01

assign #5 foo = tiger ;

이 문장을 가만히 보면 단위가 없습니다.  '5'의 의미는 무었일까요?
...

여기서 '5'는 5ns가 될 수도 있지만, 5us5ms 심지어는 5sec가 될 수도 있습니다. 이 문장 자체 만으로는 알 수 없습니다.
...
이 때 등장하는 것이 바로 `timescale 문입니다.
보통 Verilog 코드의 맨 위에 아래와 같이 선언합니다.
`timescale 1ns/10ps
여기서 슬래쉬('/')의 앞에 있는 '1ns'가 바로 단위입니다. 이 값을 '1ns'라고 선언하면 그 파일 내의 모든 시간 단위는 1ns가 되기 때문에, 위의 assign문에서도 '5'는 5ns가 되는 것입니다.


그렇다면 슬래쉬('/')의 뒤에 있는 '10ps'는 무었일까요? 바로 해상도(precision)입니다.

5ns 보다 좀 더 정밀하게 적은 다음 예문 들을 보겠습니다.

1. assign #5.5    foo = tiger ;
2. assign #5.55   foo = tiger ;
3. assign #5.555  foo = tiger ;
4. assign #5.5555 foo = tiger ;

좀 전에서 보았듯이 단위가 1ns이므로, 위의 예에서 1번은 5.5ns 딜레이가 먹습니다. 그리고, 2번은 5.55ns 가 딜레이 되죠. 그러면 3번은 5.555ns, 4번은 5.5555ns의 딜레이가 먹어야 맞겠지만 사실은 그렇지 않습니다. 해상도(precision) 10ps이기 때문에 3번과 4번은 위에서 기술한 대로 딜레이가 먹지 않습니다.

만약, 4번의 해상도가 필요하다면 timescale문을 다음과 같이 기술해야 할 것입니다.
`timescale 1ns/100fs

여기서 fs는 [펨토세컨드]로써 ps[피코세컨드]의 일천분의 일인 단위 입니다.
그러면 timescale을 설정하기 위해 고려해야 할 사항은 무었일 까요? 제 경험에 비추어서 추천을 드려 보겠습니다.

1. 프로젝트에서 사용하시는 모든 소스코드의 `timescale을 통일하십시요!

grep -r --include="*.v" "timescale" * 
 이 명령을 하면, 모든 서브 디렉토리에서 *.v 파일을 찾아 grep 명령으로 "timescale" 구문이 있는 줄을 화면상에 표시해 줍니다.

2. 대략 `timescale 1ns/10ps가 무난합니다.

  (1) 요즘의 FPGA나 ASIC의 성능을 고려하면 시간 단위는 1ns가 적당해 보입니다.
  (2) 간혹 해상도(precision)를 1ns로 하는 경우도 있고, 혹은 1fs로 하는 경우도 보았습니다.
      -> 해상도를 1ns로 하면 코드내에서 절대로 소수점 시간을 사용하면 안됩니다.
         소숫점 사용했다는 자체가 해상도를 위반한 것이기 때문입니다.
      -> 해상도를 1fs등으로 너무 낮추면 시뮬레이션 시간이 기하 급수적으로 늘어 납니다.
         시뮬레이터의 입장에서 생각해 보면, 다루어야 할 시간의 데이터가 무지하게 커져서 계산 시간이 늘어 날 것 같기는 합니다.

결론: '모든' verilog 소스코드의 맨 윗줄에 `timescale 1ns/10ps 라고 적으세요.

물론, 제 추천이니까 상황이 다르거나 더 좋은 방법이 있으시다면, 최종 결정은 디자이너의 몫일 것입니다.
언제부터인가 시뮬레이션 시간이 이상하게 오래 걸린다고 생각되신다면, 위의 grep 명령어를 써서 지금 프로젝트의 timescale 값들을 한 번 확인해 보는 것도 좋은 방법 일 것 같습니다.
이해를 돕는 연습문제(?)를 하나 내어 봅니다.
`timescale 10ns/10ps라면 assign #5 foo = tiger ;에서 딜레이는 얼만큼 먹을 까요?
답: 50ns 입니다.


AMBA bus 에서 Byte access를 위한 코드조각

ARM(SoC,FPGA)

AMBA bus를 사용하는 경우, 바이트별 접근을 위해 판단하는 시그널 생성 코드 

(참고용, 책임 못짐 ^^)


// Generate byte access from AHB bus

assign byte0_access = (HSIZE[1] | ((HADDR[1]==1'b0) & HSIZE[0]) | (HADDR[1:0]==2'b00));

assign byte1_access = (HSIZE[1] | ((HADDR[1]==1'b0) & HSIZE[0]) | (HADDR[1:0]==2'b01));

assign byte2_access = (HSIZE[1] | ((HADDR[1]==1'b1) & HSIZE[0]) | (HADDR[1:0]==2'b10));

assign byte3_access = (HSIZE[1] | ((HADDR[1]==1'b1) & HSIZE[0]) | (HADDR[1:0]==2'b11));


설명을 하면 쉽지.

HSIZE[1] = '1'인 경우라면 32비트 access 이니 전부 '1'

HSIZE[1] = '0', HSIZE[0] = '1' 인 경우라면 16비트, 따라서 HADDR[1]을 보고 상위16, 하위 16비트씩 '1'

나머지의 경우, 바이트 접근이니 HADDR[1:0] 를 보고 각 바이트별 '1'


쉽다. =).

Xilinx NGC netlist file 읽기

ARM(SoC,FPGA)

.ngc 파일에서 vhdl, verilog top 파일 만들기


ISE를 쓰는 경우, ngc파일을 가지고 있어 사용하는 경우 top파일이 필요하기도 하다.

간단하게 ngc에서 top 파일 만드는 방법

http://www.fpgadeveloper.com/2011/08/how-to-read-an-ngc-netlist-file.html


  1. To convert the netlist into VHDL type “netgen -ofmt vhdl filename.ngc“. Netgen will create a filename.vhd file.
  2. To convert the netlist into Verilog type “netgen -ofmt verilog filename.ngc“. Netgen will create a filename.v file.


VHDL literal - 표현, 선언 예

ARM(SoC,FPGA)


reference : http://www.ics.uci.edu/~jmoorkan/vhdlref/literals.html


상수

constant FREEZE : integer := 32;
constant TEMP : real := 32.0;
constant FLAG :bit_vector(0 to 7) := "11111111";
constant MSG : string := "Hello";

숫자 표현

BIT_8_BUS <= B"1111_1111";
BIT_9_BUS <= O"353";
BIT_16_BUS <= X"AA55";

문자열로 상태정의해서 사용하기

type MY_LOGIC is ('X','0','1','Z');
type T_STATE is (IDLE, READ, END_CYC);
signal CLK : MY_LOGIC := '0';
signal STATE : T_STATE := IDLE;

배열

type NIBBLE is array (3 downto 0) of std_ulogic;
type MEM is array (0 to 7) of NIBBLE;
-- an array "array of array" type
variable MEM8X4 : MEM;
...
-- accessing the whole array:
MEM8X4 := ("0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111");
-- accessing a "word"
MEM8X4(5) := "0110";
-- accessing a single bit
MEM8X4(6) (0) := '0';


The IEEE Verilog 1364-2001 Standard. What's News, and Why You Need It

ARM(SoC,FPGA)

오래된 이야기지만,

저장해 두자. 내용은 간단하고 읽기 쉽다.


차이점을 몰라도 코딩에는 문제 없지만. 이런 것이 있다는 정도 =)


Verilog-2001_paper.pdf(로컬카피)