[팁] 테터툴즈에서 Verilog용 SyntaxHighlighter 사용하기

조만간 Verilog 강좌를 시작할 예정인데, 그에 앞서 블로그에 Verilog Syntax Highlighter를 설치하였습니다.

먼저 Syntax Highligher가 뭔지 보여드리면,

글을 쓸때 요렇게 입력하면,

요렇게 예쁘게 보여주는 것입니다.

SyntaxHighligher는 [이곳]에서 다운받으시면 됩니다. 저는 최신버젼인 3.0.83을 받았습니다.
여러가지 언어를 지원하지만 Verilog는 기본적으로 지원되는 언어가 아닙니다. 하지만, Tyreal이란 분이 친절히 [Verilog용 Brush]를 만들어놓았습니다. 모두 저장해둡니다.

FTP로 두 파일을 모두 블로그에 올려두고, Telnet/rlogin으로 블로그 계정이 접속하여 압축을 풉니다.
편의상 tt(테터툴즈 기본 디렉토리)/plugins/SyntaxHighlight 에 압축을 풉니다.

$ cd tt/plugins
$ unzip syntaxhighlighter_3.0.83.zip
$ mv syntaxhighlighter_3.0.83 SyntaxHighlight
$ cd SyntaxHighlight
$ ls
LGPL-LICENSE  MIT-LICENSE  compass  index.html  scripts  src  styles  tests

Verilog용 Brush파일 shBrushVerilog.js를 scripts 디렉토리에 저장합니다.

관리자로 접속하여 ‘스킨관리’메뉴에서 skin.html을 수정합니다.
</head> 바로 앞에다가 아래 내용을 추가합니다.

<!-- Include required JS files -->
<script type="text/javascript"
src="/tt/plugins/SyntaxHighlight/styles/shCore.js"></script>

<!--
  At least one brush, here we choose JS. You need to include a brush
for every
  language you want to highlight
-->
<script type="text/javascript"
src="/tt/plugins/SyntaxHighlight/scriptss/shBrushJScript.js"></script>

<!-- Include *at least* the core style and default theme -->
<link href="/tt/plugins/SyntaxHighlight/styles/shCore.css"
rel="stylesheet" type="text/css" />
<link href="/tt/plugins/SyntaxHighlight/styles/shThemeDefault.css"
rel="stylesheet" type="text/css" />

그리고 skin.html의 제일 아래부분 </body>바로 앞에 아래 내용을 추가합니다.

<!-- Finally, to actually run the highlighter, 
you need to include this JS on your page -->
<script type="text/javascript">
    SyntaxHighlighter.all()
</script>

그리고 글을 쓸때 Verilog 코드의 앞뒤에 <pre class=”brush:verilog”>와 </pre>를 입력하면 됩니다.

마이크로프로세서, ASIC, 설계방법론의 역사

어제 발견한 Computer History Museum에 재미있는 내용들이 있어서 소개합니다.

공교롭게도 어제가 부울(Boole)이 태어난지 195년째 되는 날이었군요. 컴퓨터를 포함한 모든 논리회로는 부울 연산(Boolean Algebra)을 사용하죠.

이전 글에서 언급했듯, 1970년대에 이미 지금의 마이크로프로세서 설계기술이 거의 완성이 되었습니다.

1979년에 만들어진 M68000 프로세서의 각 기능블록들을 표시해보았습니다. Anceau의 책을 보고 직접 표시해 본 것입니다.

모토롤라 M68000 Die Photo 및 각 기능블록 [크게보기]

공정기술의 한계로 복잡도가 제한되었지만 2000년대에 만들고 있는 프로세서에 비해 그 설계기술은 크게 떨어져보이지 않습니다.

그렇다면 저 당시에는 어떤 방법으로 저런 설계를 했을까요?
지금은 당연시 사용하고 있는 설계방법론, 설계툴은 언제부터 존재 했던 것일까요?

그 해답도 Computer History Museum에서 찾을 수 있었습니다. (1960년에 강대원 박사의 이름도 찾아볼 수 있습니다)

EDA (Electronic Design Automation) 툴은 처음부터 IC를 위해 개발한 것은 아니고, 1950년대 후반부터 IBM에서 연구하기 시작했습니다. 60년대에 Logic Simulator도 개발되고 P&R(Place & Route) 소프트웨어도 만들었다고 합니다.

1967년 Fairchild의 CAD시스템

그리고 1967년에 드디어 게이트어레이와 Standard Cell이 처음 개발되었다고 합니다. 그리고 UC버클리에서 60년대에 SPICE 시뮬레이터도 개발 되었습니다.

당시 EDA툴이 어떤 것인지 또 어떻게 설계를 했는지 궁금해서 자료를 찾다가 발견한 1978 MIT의 VLSI System Design 수업자료로 당시의 모습을 상상해볼 수 있습니다.

Layout: CAD 환경이라고는 하지만 Layout 좌표를 일일히 CIF format에 맞춰 입력한 다음, 펜 플로터로 출력해서 확인해보는 것입니다.

Layout

DRC(Design Rule Check): 잘은 몰라도 자(ruler)를 가지고 Design Rule을 Check했을 것 같습니다.

Design Rule Check

Floorplan: 블록의 크기별로 종이를 잘라서 배치했었군요.

Floorplaning

참, 펜 플로터가 뭔지 잘 모르시는 분들도 계실 것 같네요.

Pen Plotter

90년대엔 VLSI를 개발하는 회사나 연구실엔 꼭 Plotter로 출력한 Layout이 벽에 걸려있었습니다. 저는 이게 그냥 장식용인 줄 알았는데, 원래는 마지막으로 전체 칩을 출력하여 문제가 있는지 확인하기 위한 절차였네요. 인텔에서 큰 방 가득하게 레이아웃을 출력해놓고 검토했다는 말도 생각납니다.

Final sanity check

한가지 더 놀라운 사실은 MIT에서 1979년과 1980년에 MPC(Multi-Project Chip)을 만들었다는 것입니다. 그리고 나중에 MOSIS로 발전하게 됩니다.

최초의 MPC(Multi-Project Chip)

MOSIS는 적은 비용으로 좋은 공정에서 칩을 만들 수 있는 MPW(Multi-Project Wafer)를 운영하고 있습니다. 반도체교육센터(IDEC)에서 운영하고 있는 MPW도 MOSIS를 모델로 한 것입니다.

Xerox PARC의 EDA환경

MIT의 교과 수업환경은 아무래도 회사보다 열악할테고, 당시(1979년) Xerox PARC에서 MPW용 DB들을 Merge하고 있는 것으로 보이는 사진을 보면 회사의 EDA환경은 Layout을 마우스와 GUI환경으로 하는 것처럼 보입니다. (Xerox PARC의 마우스와 GUI환경은 애플 Machintosh가 채택한 것으로 유명하죠)

설계환경은 열악하지만 당시 강의자료를 살펴보면 그 내용만큼은 정말 훌륭합니다.
The MIT’78 VLSI System Design Course: A Guidebook for the Instructor of VLSI System Design

지금은 거의 찾아볼 수 없는 직접 글씨를 쓰고 그림을 그려가며 만든 강의자료도 인상적이지만, 그 내용은 지금 대학원 강의교재로 써도 전혀 손색이 없겠네요.

당시 수업을 했던 Lynn Conway의 저서 “Introduction to VLSI Systems“는 김보관교수님이 갖고 계신걸 본 기억이 있는데, 그저 오래된 책이라 생각하고 지나쳤었습니다. 책 내용(draft)을 살펴보니 1979년 책이라고는 상상할 수 없는 그 방대한 지식에 놀랐습니다.

그리고 Computer Architecture에 대한 내용도 눈에 띄어 Lynn Conway의 경력을 살펴보니 Supercomputer/Superscalar의 원조겪인 IBM ACS의 Architect였더군요. Dynamic Instruction Scheduling, Multithreading 등의 자료를 보면 지금의 컴퓨터 구조는 정말 70년대에 이미 완성 되었다는 생각이 듭니다.

1979년에 Single Chip DSP(Digital Signal Processor)도 등장합니다.

로직 합성(Logic Synthesis)는 1980년대에 UC버클리의 SIS, UCLS의 RASP 그리고 콜로라도대학의 BOLD 등의 연구가 기반이 되었습니다. UC버클리의 espresso는 상당히 성능이 좋았고, 저도 예전에 PLA설계에 사용했었습니다.

이러한 연구의 영향을 받아 1986년에 Synopsys가 창립하고 케이던스의 전신인 Automated Integrated Design Systems(1983년창림, 1985년에 Gatewaey Design Automation으로 개명)에 의해서 1984년에 Verilog언어가 만들어 졌습니다.

[Verilog] 새로 컴파일하지 않고 테스트 입력/조건을 바꾸는 방법

Compiled-code방식 Verilog 시뮬레이터는 크게 세단계로 동작합니다.

  1. Compile: Verilog Code의 문법을 체크하고, 해석하고(parse/analyze)하고 Compile한다.
  2. Elaboration: 계층구조(design hierarchy)를 구축하고 신호들을 연결하고 초기값을 계산한다.
  3. Simulation: 회로의 동작을 시뮬레이션한다.

복잡하게 나누어 생각하고 싶지 않은 분들도 계실텐데, C프로그램을 해보신 분들이라면 쉽게 이해할 수 있습니다.

  1. Compiler: C컴파일러를 이용해서 C 코드를 Object코드로 만드는 것과 유사합니다.
  2. Elaboration: Object코드를 Linker로 연결해서 실행화일(Executable)을 만드는 것과 유사합니다. C Code건, 어셈블리코드건 언어에 관계없이 Object코드는 동일한 것과 같이 Elaboration은 VHDL와 Verilog를 구분하지 않습니다.
  3. Simulation: 실행화일(Executable)을 실행하는 것과 같습니다.

여기서 주목할 부분은 프로그램을 실행할때 매번 새로 컴파일하지 않고 실행화일만 실행하듯이, 시뮬레이션도 컴파일 과정을 생략할 수가 있다는 것입니다.

컴파일에 소요되는 시간이 전체 시뮬레이션에서 차지하는 시간이 크지 않은 경우도 많지만, 설계가 복잡하고 매우 다양한 경우에 대해서 시뮬레이션(regression)을 할 경우, 이 시간을 줄이는 것이 적지않은 효과가 있습니다.

물론 Verilog 소스코드가 변경된 경우라면 새로 컴파일을 해야합니다만, 사진이 바뀌고 모니터 해상도가 바뀌었다고 포토샵을 새로 컴파일하지 않듯이, 시뮬레이션 입력, 조건만 바뀌었을 경우엔 새로 컴파일 할 필요가 없습니다.

Cadence NC-Verilog를 기준으로 설명해보겠습니다.
NC-Verilog는 두가지 방법으로 실행이 가능한 데 single-step으로 실행하는 command인 ncverilog과 3-step으로 실행하는 command인 ncvlog, ncelab, ncsim이 있습니다.

3-step으로 실행하는 경우엔 마지막 단계인 ncsim만 반복적으로 실행하면 됩니다.

$ ncvlog subblock1.v subblock2.v topmodule.v
$ ncelab topmodule
$ ncsim topmodule
$ ncsim topmodule (재실행)

ncverilog를 사용하는 경우엔 ncverilog -R 옵션을 이용하면 마지막 simulation단계만 실행하게 됩니다.
3-step으로 실행하는 경우엔 마지막 단계인 ncsim만 반복적으로 실행하면 됩니다.

$ ncverilog subblock1.v subblock2.v topmodule.v
$ ncverilog -R (재실행)

이렇게 컴파일을 하지 않고 시뮬레이션만 다시 실행하면서 입력을 바꾸는 방법은 다음과 같습니다.
1. 외부파일을 사용하는 방법
Image processing을 하는 회로라고 가정하면 입력은 주로 사진 데이터입니다. 시뮬레이션 중에 사진 파일을 읽어서 사용하도록 만들면, 사진 파일만 바꿔주면 컴파일과정없이 시뮬레이션을 할 수 있습니다. 대신 외부파일을 읽어들이는 부분(parser)를 Verilog나 C언어로 구현해야합니다.

Verilog로 구현하는 경우엔 C언어와 유사한 $fopen, $fscanf을 이용하면 됩니다. 단, 텍스트파일만 읽을 수 있으므로 PPM과 같은 ASCII 데이터의 파일 format을 사용해야합니다.

C언어를 이용하는 경우 원하는대로 프로그램을 작성하여 decoding이 필요없는 BMP를 비롯, 다양한 입력을 읽어들일 수 있습니다. Verilog의 PLI(Programing Language Interface)나 SystemVerilog의 DPI(Direct Programming Interface)를 이용하면 됩니다.

2. $test$plusargs, $value$plusargs 를 이용하는 방법

$test$plusargs()는 Verilog-1995에도 존재했던 기능이고, $value$plusargs()는 Verilog-2001에서 확장된 기능입니다.

간단한 예로 시뮬레이션 결과를 waveform으로 저장하면 시뮬레이션 속도가 상당히 느려지고, 저장공간을 많이 차지할 수 있습니다. 따라서 필요한 경우에만 signal dump를 받게 되는데 이를 위해 대개 사용하는 방법은 다음과 같습니다.,

1. Verilog코드를 수정해서 $dumpvars와 같은 구문을 주석으로 처리한 뒤 새로 컴파일합니다.

initial
begin
      // $dumpvars;
end

2. `ifdef / `ifndef 를 이용하는 방법. command line에서 설정이 가능하므로 보다 깔끔한 방법이지만, 이 방법 역시 새로 컴파일을 해야합니다.

initial
begin
     `ifndef nodump
            $dumpvars;
     `endif
end

$ncverilog +define+nodump …..

이런 경우 $test$plusargs를 이용하면 됩니다. +define을 사용하는 것과 유사하지만 새로이 컴파일을 할 필요가 없습니다. (-R 옵션에 주목)

initial
begin
      if(!$test$plusargs(“nodump”))
             $dumpvars;
end

$ ncverilog -R  (dump파일 생성)
$ ncverilog -R +nodump (dump파일 생성 안함)

참고로, 간단히 설명하기 위해 dumpvars를 사용했는데, vcd형식보다 shm이나 fsdb형식을 사용하면 속도,용량에 개선 효과가 있습니다.

$value$plusargs 를 이용하면 command line에서 10진수, 16진수, 2진수, 실수 등 보다 상세한 입력이 가능합니다.

$value$plusargs (string, variable)
%b – binary conversion
%d – decimal conversion
%e – real exponential conversion
%f – real decimal conversion
%g – real decimal or exponential conversion
%h – hexadecimal conversion
%o – octal conversion
%s – string (no conversion)
%x – (undergound equivalent for %h)

예제로 클럭 주파수를 바꾸는 경우를 살펴봅시다.

filename: test.v

module test;

reg     clock = 0;
real    clock_h_period;
always #clock_h_period
       clock = !clock;
initial begin
       if(!$value$plusargs(“clock_h=%F”, clock_h_period)) begin
               clock_h_period = 10;
       end
       $monitor(“%t %b”, $time, clock);
       #100 $finish;
end
endmodule

$ ncverilog test.v +nocopyright
Loading snapshot worklib.test:v ……………….. Done
ncsim> source …/tools/inca/files/ncsimrc
ncsim> run
                  0 1
                 10 0
                 20 1
                 30 0
                 40 1
                 50 0
                 60 1
                 70 0
                 80 1
                 90 0
Simulation complete via $finish(1) at time 100 NS + 0
./test.v:15     #100 $finish;
ncsim> exit
$ ncverilog -R +clock_h=20 +nocopyright
Loading snapshot worklib.test:v ……………….. Done
ncsim> source …/tools/inca/files/ncsimrc
ncsim> run
                  0 1
                 20 0
                 40 1
                 60 0
                 80 1
Simulation complete via $finish(1) at time 100 NS + 0
./test.v:15     #100 $finish;
ncsim> exit

반복 회수를 입력하거나, Random 값 생성에 사용할 seed입력(@KyonghoKim의 코멘트)하거나 다양한 환경적인 변수에 대한 반복적인 시뮬레이션(regression)을 수행할 때 유용할 것입니다.

Computer Architecture 공개 강의 추천

1년 전 David Harris교수의 강의자료를 추천드린 적이 있었는데, 오늘 우연히 또 발견한 강의가  상당히 좋아서 추천드립니다.

인도 IIT의 S. Raman교수의 컴퓨터 구조론 동영상 강의입니다. (따라서 인도식 영어 엑센트는 감안하시고 보셔야합니다)
http://nptel.iitm.ac.in/video.php?courseId=1050

Flip-flop보다 마이크로아키텍쳐를 먼저 가르치는 상식 파괴의 접근법이 놀랍습니다. 그리고, Textbook없이 모든 그림을 직접 그리면서 설명하는 것도 멋지군요. 슥슥 컴퓨터 구조를 그리면서 별것 아니라는 듯 가르치는게 KAIST 조규형 교수님을 떠올립니다.

Raman교수의 Datapath 구조 강의 중

제가 작년에 사용했던 강의 자료 중

Youtube 검색 중 저 Datapath그림이 썸네일에 눈에 띄어서 살펴본 것인데요. 작년에 제가 충남대에서 강의할때 이해를 돕기위해 고민해서 만든 자료와 상당히 유사합니다. 같은 접근방식을 사용한다는게 반가웠고, 한학기 컴퓨터 구조 강의가 모두 제가 추구하는 방식으로 설명되어있을 것을 생각하니 벌써 행복해지네요. 아직 몇시간 분량 밖에 못보았는데 틈틈이 다 봐야겠습니다.

NPTel이 무엇인가 찾아보니 인도 정부에서 지원하는 “국가 기술향상 교육 프로그램”이라고 합니다.
다른 과목에 대한 강의도 공개되어있습니다. (모두 동영상 강의가 있는 것은 아니더군요)
http://nptel.iitm.ac.in/courses.php?branch=Comp

내친김에 공개 강의 정보를 검색해보았더니 잘 정리해 둔 글이 있네요.
http://blog.naver.com/csps2010/130093140514

국내에도 KOCW라는 싸이트에 공개 강의가 많이 있습니다. 최근 TED/TEDx로 인해 공개 강의에 관심이 많아지는 것 같습니다.

이제 의지만 있다면 인터넷에 공개된 강의자료 만으로도 상당한 수준의 지식을 얻을 수 있을 것 같습니다. 저도 유용한 자료들을 찾아 틈틈히 공부를 하고 또 공유해야겠다는 다짐을 해봅니다.

집적회로설계 종강

짧고도 긴 한학기 수업이 끝났습니다.

좀 버릇 없는 생각이겠지만 학교에 다니는 동안 교수님들을 보며 “왜 저렇게 밖에 못가르치는 걸까”라는 생각을 종종 했습니다. 반면 “어떻게 저런 강의를 할 수 있을까” 감동을 받은 적도 있습니다만 매우 드문 경우였습니다.

그동안 일회성의 강의나 세미나는 많이 해보았습니다만, 한 학기 내내 수업을 맡은 것은 처음이었습니다. 대다수의 교수들이 강의를 대충하는 이유를 알 수 있더군요. ^^;; 월,화,수,금,월,화,수,금 어찌나 금요일이 빨리 돌아오는지…

여러과제를 동시에 수행하는 회사 생활을 하면서 강의를 한 다는 것이 사실 무리였지만, 그래도 참 보람있는 시간이었습니다. 첫번째 제자분들의 도움으로 수업을 잘 마무리 지을 수 있어서 고마웠습니다.

처음 계획했던 것 만큼 전달하지 못하여 아쉬움도 많이 남습니다만, 그래도 어느정도 목표는 이루었습니다. 어떤 형태로든 학생분들에게 motivation을 제공하고 저 스스로도 얻고자 하는 것이 가장 중요한 부분이었는데 다행히 이부분에 대해선 여러분들과 공감을 나눌 수 있었던 것 같습니다.
개인적으로는 인생(?)을 뒤돌아보는 중요한 계기가 되었습니다.

값진 인연이었고 앞으로 어디서든지 또 뵙겠습니다. ^^

p.s. 학교 다닐 때도 거의 안해 본 종강파티였는데, 정말 즐거운 시간이었습니다. 감사합니다.
p.s. 제때 못올린 강의자료들은 홈페이지를 통해 계속 A/S하겠습니다.

무료 Verilog Simulator – Icarus

gEDAGPL을 따르는 EDA툴킷 개발 프로젝트로 2002년에 시작되어 지금까지 꾸준히 업데이트가 되고 있으며 오픈소스프로그램으로는 높은 완성도를 갖고 있다.

http://www.gpleda.org/

이중에서도 Icarus Verilog Simulator는 무료로 사용할 수 있는 시뮬레이터 중에 가장 유명하다. gEDA 프로젝트도 Stephen William이 개발한 Icarus로 부터 시작되었다.

오픈소스프로그램들은 직접 컴파일을 해서 사용하는 번거로움이 있지만 다행히 Icarus와 gtkwave(waveform view)를 간단히 설치할 수 있는 intall package가 있으며 아래링크에서 받을 수 있다.

iverilog-0.9.1_setup.exe [5.33MB]

설치과정
1. iverilog-0.9.1_setup.exe실행, Next

2. License Agreement에 동의(필수), Next

3. 설치위치 변경(선택). 기본 값인 “C:\Program Files\Icarus Verilog” 대신 “C:\Icarus”입력.
변경하지 않을 경우 환경변수의 PATH값을 “c:\progra~1\icarus~1\bin”으로 변경해야함.
(환경변수 변경 방법은 10번 과정 참조)

4. waveform view인 GTKWave설치 (필수)

5. 시작메뉴폴더 생성 (선택)

6. 바탕화면 아이콘 추가 (선택)

7. 설치준비완료

8. 설치

9. 설치 완료. 환경변수 추가 선택(필수)

10. 환경 변수 설정. 3번과정대로 설치위치를 변경하지 않고 긴 이름의 디렉토리를 사용할 경우는 아래와 같이 직접 환경변수를 설정해주어야 정상적으로 사용이 가능하다.
“C:\Program Files\Icarus Verilog Simulator\bin” 부분을 “C:\progra~1\icarus~1\bin”과 같이 변경하여 저장한다.

11. Command창 실행. ‘시작->실행’ 메뉴 실행후 ‘cmd’, 확인

12. 디렉토리 변경후 Icarus실행.
icarus가 설치된 디렉토리로 이동 (cd c:\icarus) 후
예제파일인 lfsr16.v실행
iverilog lfsr16.v <enter>
vvp a.out <enter>
gtkwave <enter>

13. waveform확인 (결과파일’dump.vcd’ 로드)

14. waveform확인 (신호선택)

Open Cell Library (Nangate, Synopsys)

1. Nangate의 오픈 라이브러리입니다.
현재 industry수준에서는 최고 수준의 공정인 45nm라는 것이 매력적입니다.
135종의 cell에 대하여 datasheet, schematic, layout, spice netlist(pre/post), timing/power library, verilog model까지 화끈하게 제공합니다.
아래 주소에서 간단한 sign-up절차 후에 download 받을 수 있습니다.
www.nangate.com/openlibrary

2. 시높시스에서도 90mn 라이브러리를 공개했습니다.
University Program의 일환으로 OpenSPARC을 합성하는데 필요한 PLL, Memory(RAM, CAM) 등을 모두 제공하는 것이 흐뭇합니다.
아쉽게도 완전한 공개는 아니고 Synopsys SolvNet ID가 있어야 download가 가능합니다. SolvNet ID를 만들려면 synopsys licence를 갖고 있어야합니다(Site ID를 알면 직접 ID등록가능)
그리고 2.4GB짜리 압축파일로 되어있어서 날 잡아서 받아야 합니다. ^^;
https://www.synopsys.com/Community/UniversityProgram/Pages/Library.aspx

제가 11년전에 개발하여 국내 최초로 공개했던 IDEC 셀라이브러리가 0.6um였는데 이제 0.045um 라이브러리가 공개되고 있으니 격세지감을 느끼네요. ^^;