일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Design DNN Accelerator
- CUDA
- AMBA
- DNN 가속기
- DNN Accelerator
- gcc 컴파일
- Pyverilog 설치
- Data HAzard
- 이진수 곱셈 알고리즘
- Makefile compile
- 딥러닝 가속기
- systolic array
- linux c 컴파일
- Pyvrilog tutorial
- pytest-pythonpath 설치 오류
- 남산업힐
- linux c++ 컴파일
- pyverilog 설치 오류
- CLOCK GATING
- gpgpu-sim
- makefile
- Pyverilog 튜토리얼
- pygraphviz 설치 오류
- linux makefile 작성
- 대구 반도체 설계기업 특화
- Pyverilog 실행
- 데이터 해저드
- 클럭 게이팅
- 컨벌루션 연산
- CDC
- Today
- Total
목록Digital logic (40)
오늘은 맑음
레지스터를 사용하는 방법으로는 크게 두 가지가 있습니다. 1. Single port register 2. Dual port register 1번은 일반적으로 알고 있는 Single port register입니다. read와 write를 동시에 할 수 없죠. 따라서 write와 read를 번갈아가면서 사용해줘야 합니다. 반면에, Dual port register는 read port와 write port가 분리되어 있습니다. 따라서 read와 write를 동시에 할 수 있습니다. 정말 좋겠죠? 데이터를 계속 밀어넣음과 동시에 반대쪽에서는 빼서 사용할 수 도 있답니다. 하지만 항상 좋을 수는 없습니다. 모름지가 어떤 한 가지가 좋아진다면, 무언가는 안좋아지기 마련이죠. Dual port register를 사용..
모호한 표현을 사용하지 말자 몇 가지 예시가 있습니다. 1. 동일하지 않은 data width를 가진 신호를 연결하기 input [2:0] in_data; wire [3:0] a; assign a = in_data; 이렇게 할당하게 되면 a[3]은 어떠한 값이 될까요? 요즘 컴파일러들은 매우 좋아서 아마 알아서 0으로 채울지도 모릅니다. 하지만 어떤 상황에서 무슨 에러가 발생할지 모르는 코드가 됩니다. 컴파일러에 따라 달라지겠죠. 따라서 위와 같이 매우 모호한 코드는 피해야 합니다. assign a = {1'b0, in_data}; 이런 식으로 사용하지 않는 비트는 꼭 채워주도록 합시다. 2. data overflow 사용하기 counter를 짤 때 마침 딱 8까지 반복해서 숫자를 세는 상황이 발생했습니..

rtl 설계시 !와 ~를 자주 사용합니다. 코드를 예시로 들면 아래와 같습니다. wire [3:0] a;reg [3:0] r_out; always @(posedge CLK, negedge nRST) begin if(!nRST) begin r_out
1. signal 묶기, 결합연산자함께 출력으로 나가는 데이터 또는 함께 입력으로 들어갈 때 사용합니다.사용법은 묶고자 하는 시그널들을 중괄호{} 안에 넣어 사용합니다. 예를 들면wire a, b; a와 b라는 신호가 있다면 assign out = {a, b}; 다음과 같이 묶습니다.이렇게 되면 msb는 a가 되고 lsb는 b가 됩니다. 2. 중복 연산자역시 중괄호 {}를 사용합니다. assign [3:0] out; 다음과 같이 4bit의 out이 선언되어 있을 때 out을 1bit로 채우는 방법은 다음과 같습니다. 1. assign out = 4'b1111;2. assign out = {4{1'b1}}; 지금은 4bit만을 사용했지만 만약 128-bit? 256-bit? 이렇게 큰 데이터를 사용하는 경..
요즘 딥러닝 하드웨어 가속기(NPU)에서 곱셈기에 대해 공부하고 있습니다. vivado에서 곱셈기를 합성해보면 다양한 결과가 나옵니다. module mult( input [IN-1:0] a, input [IN-1:0] b, output [OUT-1:0] c ) assign c = a * b; endmodule 예를 들어 위의 곱셈을 수행하는 모듈을 만들고 합성을 해보면 어떨때는 DSP를 사용하고 어떨때는 LUT-based multiplier가 생성이 됬습니다. xilinx document를 찾아보니 input width에 따라 합성 결과가 달라진다고 설명되어있습니다. 어떠한 케이스에서는 LUT-based multiplier가 생성이 되고, input width가 매우 큰 경우에는 dedicated mul..