시작하기에 앞서
- 강의
반도체 설계 교육 센터 에 올라와있는 송재훈 강사님의Verilog HDL 언어 초급 및 설계 가이드라인
강의를 듣고 작성한 필기노트 입니다.
Verilog HDL
ㅤ
- HDL description : 내가 작성한 코드
- library : 각 게이트에 대한 라이브러리
- Constrain : 해당 모듈이 silicon에서 차지할 Area, timing, power, testability
Module
- Systems & Circuit/logic Designs are represented as module unit in Verilog HDL
- Module 은 C에서 함수 정도의 위치
- 각 Module끼리는 Signal로 연결 됨
-
Structure of Module
- Name of a Module
- Start with letter or underscre
$
,_
,letter
,digit
can be used
- comment :
//(한줄)
,/* (블럭) */
- Description : 협업 시 필수, 개인 작업시 있으면 좋음 (개발이나 하고 보십쇼)
-
Module interface
- 두꺼운 화살표 = multibit, 얇은거 = single (당연)
- out인지 in인지 direction 지정
- multi인 경우 [3:0]과 같이 MSB, LSB순으로 지정
- signal type(
wire
orreg
)도 지정해줘야 하는데 사실 위에 모듈 명 이후의 괄호에서 모두 해결해도 괜찮음 - 다양한 port sig type 지정 방법
- Different Type of Module BODY
- 어떤 추상화 레벨로 게이트를 묘사하느냐에 따라 다양한 레벨의 코딩 방법이 존재함
- 4 to 1 Multiflexer를 예시로 살펴보면
- Structural Style (제일 LOW)
-
physical circuit을 그냥 스트레잇하게 말로 표현
-
- Dataflow Style
-
input signal의 transformtation으로 output을 묘사
-
- Behavioral Style
- 예상되는 행동을 묘사
-
제일 natural language에 가까워 추상화 정도가 가장 높음
- Structural Style (제일 LOW)
Signals
- Available Values of Signals
- Verilog 시그널은 4개뿐
- 0 : logic zero or false condition
- 1 : logic one or True Condition
- X : interpreted ‘0’ or ‘1’ or ‘Z’ or in the state of change
- Z : HIGH IMPEDANCE 물리적 cut off
- Verilog 시그널은 4개뿐
- Classes of Signals
Signal의 클래스는 여러개가 있는데 모든걸 저장하는건 불가능이니 저장 필요 여부에 따라 시그널의 클래스를 나눔
- Net
- 그냥 소자간의 물리적 연결을 나타냄
- Register(Variable)
- C에서 변수와 동일.
- 새거 할당하기 전까지는 유지임
- Net
-
NET signal type
- wire : single driver nets
- tri : High impedance가 가능함. tri는 nets with multiple sources
- wand, wor = 논리합성 불가 → 시뮬레이션용
- Scalar Signals And Vectors
- Scalar
- single wire connection → single logical value at one time
(e.g.
clock
)
- single wire connection → single logical value at one time
(e.g.
- Vectors (=Buses)
- multiple-line signal → complex values and codes can be sent and recieved ( e.g.
32-bit microprocessor
)
- multiple-line signal → complex values and codes can be sent and recieved ( e.g.
- Scalar
- Vector Specification
- Vector가 기본형이고, Scalar가 special case of vector (MSB=LSB인 vector)
- [-5 : 0] 도 문법적으로는 허용~
- External Signal
- module 내부에서 정의된 signal들은 전부 internal signal
- External Signal은 module ports로 정의해야함
- module port
- input
- environment에서 모듈이 data를 읽어옴 system 내부의 포트에 쓰는 건 불가능
- output
- data가 모듈에서 environment로 보내짐 system에서 읽는 건 불가능
- inout
- 둘 다 됨. bi-directional
- input
A Structural View of System
Module Instantiation
- module provides a template
- module template에서 object를 만드는 것 : instantiation 각각의 object = instance
-
C언어에서 함수처럼 한 모듈에서 다른 모듈을 호출 가능
- 호출(invoke)시 verilog가 알아서 instance를 만듦 이름은 직접 정해줘야 함 (왜냠 여러개 불러 올 수도 있자너~)
-
Port Connecting Rules
module instantiation flexibility를 위해서 outside와 포트 연결 시, Rule이 필요 모든 포트는 internal part 와 external part가 존재
-
input port
internal :
net
external :net or reg
- inout port : must be **
net** (**both**)
-
output port
internal :
reg or net
external :net
- 받는 쪽 = WIRE라고 생각하면 좋음!!
-
- port maping
- ordered port list
- 따로 정의된 모듈을 새로 불러와서 INSTANCE로 만든 후 로컬포트와 인스턴스 포트를 맵핑하는 방법
- 원래 모듈의 포트정의 순서대로 로컬 포트를 명시하면 됨~ (C 함수와 유사)
- Connecting Ports by Name
- 로컬 포트명을 인스턴스 포트명 옆에 괄호를 열고 표시
- Unconnected Ports
- 안 쓰고 싶은 포트가 있는 경우 인스턴스 불러올 때 포트를 안 쓰면 됨!! name, order 모두 동일!!
- ordered port list
베릴로그 기본 제공 모듈 = 인스턴스명 안 써도 ㄱㅊ 직접 만든 모듈 = 인스턴스명 명시 꼭!!
Specification with Signal Transformation
Posible Operand Types for Expression
- Constant
- literal : 23, 0.1, 2’b01
- Named Constant : ‘define A 10, parameter A=10;
- parameter = 로컬, define = 글로벌
- Signal
- Function call : f1(s)
- Bit-Select and Part-Select
-
reg [7:0] DataBus;
라고 시그널이 선언되었을 때,DataBus [3];
혹은DateBus[5:2];
와 같은 방식으로 선택할 수 있음
-
- Operator
- Relational Operators
<
,>
,<=
,>=
등을 이용할 수 있으나, X 혹은 Z가 포함된 경우 모두 알수없음(X)가 됨===
,!==
비트 단위로 비교함 → 따라서0xx0===0xx0
은1
==
,!=
값을 비교 → 따라서 X나 Z가 있는 경우 X
-
Bitwise Operators
- Shift Operators
<<
,>>
- e.ㅎ. regA « 3 을 하면 regA의 비트들이 왼쪽으로 3칸 이동 후 빈곳은 0으로 채워짐
>>>
의 경우 왼쪽으로 옮기고 0으로 채우되, sign bit는 유지
- Relational Operators
- Continous Assignment
- 논리합성 안 됨
- assign #3 ChipOut = Switch;
- #3 ⇒ delay 3
- ChipOut ⇒ Target으로 net만 가능
- 우변은 암끼나 가능
- Conditional Assignment
-
논리합성 가능
-
- Delay
- #t 와 같은 방식으로 사용
-
실제 회로에서 딜레이를 원한다면 회로를 합성해야 함
→ 고로 온리 시뮬용
- 1로 바뀌어서 어사인 하려다가 딜레이 동안 우변값이 바뀌면 어사인 안함요