IT기술

꼭 알아야 할 TCL, VERILOG 특징&명령어 모음

backend엔지니어 2023. 3. 6. 01:25

TCL의 특성

한 번에 하나의 명령을 사용해야 합니다. cl 인터프리터는 한 줄에 하나의 명령어만 나옵니다. 그리고 모든 명령은 한 줄 안에 작성되어야 합니다. 그러나 한 줄에 여러 명령을 쓰면 프로그램에 있을 때 이해하는 데 도움이 될 수 있습니다. 이 경우 ";"를 사용하여 한 줄에 여러 명령을 사용하여 각 명령을 구분할 수 있습니다. 또한 명령어가 길고 여러 줄에 걸쳐 작성해야 하는 경우 다음 줄이 계속된 명령어에 해당함을 인터프리터에 표시할 수 있습니다. 공백이나 탭과 같은 공백 문자는 "\" 기호 뒤에 오면 안 됩니다.

 

TCL 주석

tc; 인터프리터는 # 기호가 줄의 시작 부분에 나타날 때 전체 줄을 코멧으로 무시합니다. # 기호가 선의 시작점 밖에 나타나면 주석으로 간주되지 않습니다. 줄의 가운데에 주석을 달려면 ", "를 사용합니다. "|"를 사용하여 여러 줄에 걸쳐 주석을 작성할 수 있습니다.

 

TCL 명령어 모음

1) command argument1 argument2 argument3 먼저 명령 이름이 표시되고 전달할 인수가 나열됩니다. 명령어와 각 인수의 구분은 공백 및 탭과 같은 공백 문자로 구성됩니다. tcl 명령어에는 tcl 인터프리터 자체에서 제공하는 built-in명령어와 사용자 정의 함수가 포함되어 있습니다.

2) 백슬래시 문자열

백슬래시 뒤에 오는 글자는 본래의 의미를 잃고 다른 의미로 사용된다. 연산자 기호로 사용하는 것이 가장 유용합니다.

3) 그루핑과 변수 치환

tcl에서 argument의 구분은 공백 문자로 구분되지만 명령어로 넘겨줄 argument에 공백이 있으면 대괄호와 따옴표를 사용합니다. 가새와 따옴표의 차이점은 가새는 변수를 바꿀 수 없는 반면 따옴표는 변수를 바꿀 수 있다는 것입니다. 아래의 두 경우 모두 puts에 의해 명령어에 전달되는 argument는 하나뿐이라는 점에 유의해야 한다.

4) 띄어쓰기

tcl/tk는 띄어쓰기에 약간 민감하다. 특히 명령어 그룹핑에 "{}"를 사용하고, 명령어 nesting에 "[]"를 사용할 때 기호 사이에 항상 공백이 있다는 것을 기억하는 것이 좋습니다. 특히 닫는 괄호와 여는 괄호와 함께 사용할 때 오류가 발생합니다. 문법적 오류가 없고 오류가 발생하면 괄호가 닫혀 있거나 열려 있지 않은지 확인해야 한다.

5) switch구문.

switch 문은 값의 다양한 값에 따라 처리가 달라질 때 사용됩니다. 네 가지 옵션이 있습니다.

-exact:value의 값은 패턴과 정확히 일치해야 합니다. tcl 인터프리터는 다른 옵션을 지정하지 않는 한 이 옵션을 지정한 것으로 간주합니다.

-glob : glob 스타일 패턴 매칭을 사용합니다.

-regexp 정규식을 사용하여 패턴 일치를 사용합니다.

-- : 옵션의 끝을 나타냅니다. 값이 "-"로 시작하는 경우 옵션으로 오인되지 않아야 합니다.

6) 문자열 조작

tcl과 같은 스크립트 언어가 각광받는 이유는 문자열 조작이 가능하기 때문이다. 문자열은 알파벳 또는 밑줄 문자로 시작하는 문자 집합입니다. 알파벳이나 밑줄로만 시작하는 문자라면 따라올 수 있는 문자에 제한이 없다.

7) 문자열 일치.

string match 명령에 사용되는 패턴은 glob-style 패턴입니다. 유닉스 셸에 사용되는 wild card 문자를 사용하여 설명하는 패턴입니다.

8) 문자열 비교

string compare 명령을 사용합니다.

9) package

package는 다양한 기능을 라이브러리에 저장해 활용할 수 있는 장점이 있다. 프로젝트 규모가 작을 때는 중요하지 않지만, 규모가 커지면 모든 기능을 관리하기 어렵다. 패키지를 생성하려면 패키지를 구성하는 구성 요소를 생성해야 합니다. 그런 다음 패키지 인덱스를 만듭니다.

- package 구성 요소 생성

package provide 패키지이름 - package index만들기

% pkg mkIndex 패키지 경로 - 패키지 탐색 경로

lapend auto_path 패키지 경로 - 패키지 선언

package require패키지이름

 

VERILOG

RTL

 

register -transfer level 레지스터 및 논리 회로를 사용하여 동기식 디지털 회로를 설계하는 수준입니다. 논리적 작동 측면에서 동기식 디지털 회로를 모델링합니다. rtl은 verilog로 구현된다. 동기 회로는 레지스터 논리와 조합 논리의 두 가지 유형으로 구성됩니다. 간단한 논리 게이트와 플립플롭에서부터 통신 모뎀, 멀티미디어 프로세서, 마이크로프로세서에 이르기까지 디지털 시스템의 기능과 회로 구조를 표현하기 위해 개발된 하드웨어 기술 언어이다. 회로를 설계하고 검증하기 위한 언어의 필요성이 대두되었다.

 

logic

combinational logic

출력 값이 입력 값에만 영향을 받는 논리 회로

sequential logic

출력 값이 입력 값 및 이전 입력에 의해 영향을 받는 논리 회로입니다.

 

data type

1) wire

다른 element들을 연결해 주는 데 사용됩니다. 물리적인 연결선으로 다뤄지며 특정 값을 저장할 수는 없습니다. 그러므로 연속적인 할당으로 코드를 구현할 때 사용합니다.

2) reg

다음 값이 할당되기까지 현재 값을 유지한다. 그러므로 절차적 할당으로 코드를 기술할 때 사용됩니다. 만약 combination logic을 reg로 구현하면, 현재 값을 유지할 필요가 없으므로 wire처럼 합성됩니다.

 

assign 할당

assign문법을 사용하여 combination logic을 선언하는 것이 연속적인 할당이고, always initial 등의 문법을 사용하여 logic을 선언하는 것이 절차적 할당입니다. assign을 쓰는 data type은 항상 wire여야만 합니다. always, initial 등의 내부에서 사용되는 data type은 reg여야만 합니다.

 

continuous assignment assign

( 좌변 ) = (우변); 좌변에는 항상 wire type변수만 올 수 있습니다.

우변의 값에 변화가 있을 때마다 좌변에 할당을 해줍니다.

procedural assignment

always @([sensitive list]) begin~end sensitive list가 변할 때마다 할당을 하라는 의미입니다.

 

여백

- 비칸(space)

- 탭(tap)

- 개행(enter)

여백을 구성하는 요소들입니다. 어휘단위를 분리하는 용도 이외에는 무시됩니다.

 

verilog hdl 개요

module : 특정한 목적을 위해 묶어진 변수들과 함수들의 모임, 하나의 라이브러리 개념 module_name = module입니다.

port_list = 입출력을 말합니다. 어떤 입출력이 들어가는지 적으면 됩니다.

port선언 = 뭐가 입력, 출력인지 정의합니다.

파란색 박스 = 사용할 변수를 선언합니다.

빨간색 박스 = 실제로 동작할 코드를 작성합니다.

port : 컴퓨터 하드웨어에서는 컴퓨터와 다른 컴퓨터, 장치 사이의 인터페이스 역할을 담당

 

3가지 구문

1) 논리 합성용 구문

게이트 수준 합성을 지원하는 구문들로 assign, always, if-else, case, for 등이 있습니다.

2) 시뮬레이션용 구문

시뮬레이션을 위한 테스트 벤치의 작성에 사용됩니다.

3) 라이브러리용 구문

셀 라이브러리 설계에 사용됩니다.

 

모듈

verilog는 모듈을 기본단위로 사용합니다. 머리부 선언부 몸체부로 나눌 수 있습니다. 머리부는 module키워드로 시작하여 모듈이름, 포트 목록으로 구성됩니다. 선언부는 포트방향, 비트폭, 자료형, 매개변수 선언으로 구성됩니다. 몸체부는 기능, 동작, 구조등을 표현하는 다양한 verilog구문들로 구성됩니다. 병행문의 특성을 가지기 때문에 문장순서와 무관하게 동일한 결과를 가집니다. 모듈 내부로 들어가는 입력포트는, 모듈 외부에서는 net reg형이 될 수 있으며, 모듈 내부에서는 net형이 됩니다. 모듈 외부로 나가는 출력포트는, 모듈 내부에서는 net reg형이 될 수 있으며, 모듈 외부에서는 net형이 됩니다.