2023.11.08
TOOL : Quartus Prime Lite Edition(Ver.18.1)
Board : DE1-SoC
FPGA : ALTERA CycloneV SoC (5CSEMA5F31C6N)
FPGA : MAX 10 (10m08sae144c8g)
LANGUAGE : Verilog(Ver.2001)
NET(WIRE) VS Variable(reg) data type
wire
wire 는 element들을 연결, input값 그대로 출력 값 저장 불가 (continuous assignment)에서 자주 사용된다.
reg
reg는 다음 값이 할당 되기 전 현재 값을 유지한다. (procedural assignment)
또한 조합논리(combination logic) 구현 시 값 유지가 필요 없기에 wire처럼 합성된다.
Procedural Blocks
Always vs Initial
Always
블록은 지속적이거나 순차적인 동작을 설명하는 데 사용된다.
지속적으로 실행되거나 clk edge와 같은 특정 이벤트에 의해 triger된다.
always 블록 내의 코드는 시뮬레이션 동안 반복적으로 실행되며, 회로의 지속적인 동작을 나타낸다.
initial
시뮬레이션의 시작 시 또는 시뮬레이션이 리셋될 때 한 번 실행되는 코드 블록을 지정하는 데 사용(tb 사용시 initial ~ begin-end task와 자주 사용)initial 블록 내의 코드는 시뮬레이션 동안 한 번만 실행되며 후속 시뮬레이션 주기에서 다시 실행되지 않는다.
Blocking vs Non Blockong
Blocking(=)
combination에서 사용
한 줄의 코드가 완전히 실행되고 다음 줄의 코드로 제어가 넘어가기 전까지 대기한다.
즉, 한 줄의 코드에서 변수에 값을 할당하면 그 값이 즉시 업데이트되어 다음 줄의 코드에 영향을 미친다.
따라서 순차블록에서 사용되며, 필요없는 대기시간을 야기하기도 한다.
Non Blockong(<=)
sequential block에서 사용
Non-blocking assignment은 한 줄의 코드에서 변수에 값을 할당하더라도 다음 줄의 코드로 제어가 즉시 넘어간다..
이는 병렬적으로 여러 블록을 실행하는 데 유용하며, 모든 할당이 동시에 발생한다.
코드 디버깅이 되게 간단해질 수 있으나, latch가 발생할 가능성이 있음 잘사용해야한다.
Behavioral State
State Muchine
Moore
상태에 따른 출력이 정해진다.
각 상태에서의 출력은 해당 상태에만 의존하며, 입력 신호만이 상태 전이를 결정하는 특징이 있다.
Mealy에 비해 느리고 state가 커지지만 안정적으로 값을 출력하기 때문에 자주 사용
Mealy
Mealy 상태 머신은 상태에 따른 출력이 아닌, 상태와 입력에 따른 출력을 가지는 특징을 갖는다.
state는 최소화 할 수 있겠지만 출력, 입력상태에 의존하기 때문에 안정성을 고려해야한다.
Simthesys
always 사용 time 0에서 시작(power가 들어가는 시점)
Simulation
simulation을 하는이유? 기타 하드웨어 장비가 필요하게 된다. 따라서 simulation통해 검증
파라미터, 버스검증시 initial구문을 사용한다. time 0에서 시작(power가 들어가는 시점)
물론 simulation에서 always도 사용
Sensitivity lists (*)
ex) always @(*)
Delay control(#delay로 딜레이를 줘서 원하는 spec을 설계가능)
Subprograms(Tasks vs Function)
재사용 가능한 코드 블록을 정의하는 데 사용
Task
(begin - end)(순차처리 되므로 순서도 중요)
여러 개의 문장을 포함하는 재사용 가능한 코드 블록을 정의한다. 특히 simulation과 test bench 만들 때 사용된다.
Function
합성이 되며, cpu에서 많이 정의한다.
단일 값 반환 계산(병렬 계산 수행가능)
Structural modeling
하드웨어 설명 언어(HDL)인 Verilog 또는 VHDL과 같은 환경에서 사용되는 개념으로, 디지털 회로를 모델링할 때 다양한 모듈과 컴포넌트를 사용하여 전체 시스템을 설명하는 방법을 말 한다. 이는 디지털 시스템을 각각의 구성 요소로 나누고, 이를 연결하여 전체 시스템을 표현하는 방식이다.
Module instantiation
이미 있는 하나의 블록을 불러와 사용하는 것
Primitive instantiation
원시 인스턴스화(Primitive instantiation)는 하드웨어 설명 언어(HDL)에서 사용되는 개념이다.
디지털 회로를 설계할 때 기본적인 논리 게이트, 플립플롭, 레지스터 등과 같은 원시(primitive) 컴포넌트를 사용하여 회로를 구성하는 것을 의미한다.
RTL
검증을 초기화 해본다.
합성의 경우 CODE분석
SOF(SRAM OBJECT FILE)파일을 만들어
p13
합성가능한 Verilog
reg > unsign
integer sign
gate pmos nmos로 만들 수 있어야한다.
Sequential block(begin/end) <-------> fork / join(독립적으로 진행할 때 bus modeling시 사용)
File open과 비슷하다
readmemb(binary) / readmemh(hex) 파일에 있던걸 초기화
`(back tick)
라이브러리 추가시 `include
`unconnected 일때는 pull_up pull_down해줘야한다.
p14
합성 불가 verilog 구문
simulation할 때 사용
-time, real, realtime
pull_up pull_down
drive strengths > SDC해주기 위해 사용
inter RHS, LHS 둘다 걸려있는 형태
중간 값이 변하면 변하는 대로 값을 넣어줌
그러나 INTRA는 RHS 쪽에 있음
어떤 TEMP에 값을 빽없 한 후 값을 다시 불러온다.
P15
p18
combination block