Simulation 에 해당하는 글3 개
2010/10/28   [Verilog] 새로 컴파일하지 않고 테스트 입력/조건을 바꾸는 방법 (2)
2008/07/14   칩 테스트 환경 개선 (2)
2008/03/26   Verilog Coding Style for Synthesis (8)


[Verilog] 새로 컴파일하지 않고 테스트 입력/조건을 바꾸는 방법
Verification | 2010/10/28 13:06
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)을 수행할 때 유용할 것입니다.

2010/10/28 13:06 Donny 

, , ,
김지훈 2010/10/28 23:40
오.. 이런 기능이 있었군요! 저도 언제한번 날잡고 다시 처음부터 살펴봐야겠어요.
donny 2010/10/29 00:59 
설계를 주로 하는 사람들은 주로 합성가능한 문법만 관심을 갖다보니, Verilog-1995 기능 중에도 안쓰는게 많은 듯.

툴 기능도 쓰던 형태로만 계속 우려먹고, 프로젝트 일정에 쫓겨서 매뉴얼도 잘 안보고 ^^;;;
Name
Password
Homepage
  Secret
Description
 

칩 테스트 환경 개선
Verification | 2008/07/14 20:20
지난 달에 Fab-Out된 제품의 Wafer Test를 진행 중이다.
내가 설계한 MIPI DSI IP는 이미 작년에 Demo용 Test Chip으로 제작한 바 있으나 말그대로 테스트칩이라 Demo Kit상에서 직접 테스트했었고 Wafer Test는 처음.

MIPI DSI/D-PHY Protocol이 복잡하고 고속 동작을 해야하기 때문에 Test Setup의 난이도가 매우 높다. 시작한 3주만인 오늘에서야 드디어 정상 동작이 확인되었다. 다른 Test와 병행했던 이유나 장비사정도 있었긴 하지만 어쨌건 상당히 고전한 셈. 이번 주에 Fab-Out되는 제품이 2개 더 있기 때문에 내일까지 완료하지 못하면 일정이 매우 어려워질 상황에 끝나서 다행이다.

나름 고생이었지만 얻은 바도 있다. 그동안 고질적인 문제가 Test Vector생성과 Test장비 사용을 오가는 과정이 오래걸린다는 것이었다. Test Vector는 설계 Workstation에서 생성하고 Test는 별도의 장비에서하기 때문에 Test중에 Test Vector를 다시 생성하는 것이 불가능했다. 아쉬운대로 Text파일을 에디터로 수정하는 것 이상의 Vector수정이 불가능했었고 이 때문에 Test Vector 생성에 오류가 있는 경우엔 다시 개발팀으로 돌아와야했다. Test장비는 다른 건물에 있거나 외주업체에 있는 것을 사용하기 때문에 Vector의 수정과 확인에 불필요하게 소비하는 시간이 많았다.

babyworm님이 안되는 게 어디있어?에서 언급했 듯, 그동안 당연시 생각했던 과정을 개선하였다. 장기간 테스트를 하면서 불편이 컸기에 노트북 PC에서 Test Vector 생성이 가능하도록 환경을 구축하였다. Windows XP에 Cadence LDV 5.1을 설치하였고, cygwin, tcsh, xterm, vim을 설치하여 Workstation과 동일한 환경을 설정하였다.

테스트엔지니어가 작업하는 동안 vector를 새로 생성하고 확인하거나 수정하여 바로바로 FTP로 upload해서 결과를 보는 이 편리함. 미리 완벽한 vector를 만들어 가야한다는 부담감과 스트레스도 전혀없고, vector수정을 기다리는 테스트엔지니어 눈치볼 일도 각자 손가락 빨일도 없다.
왜 그동안 이렇게 안했었는지... ^^

PC에 simulation환경을 setup하는 과정은 조만간 간단히 정리해 올려야겠다.
2008/07/14 20:20 Donny 

,
sooy 2008/07/16 10:49
축하드려요! 제꺼도 잘나와야할텐데 ㅠㅠ
9월 포루투갈행 permission은 획득! 그러나 제품 Fabout일정과 절묘히 겹칠 거 같아 아직 관망중이에요.
유럽여행기 기대할께요.
donny 2008/07/16 16:25
과연 동유럽에 이어 서유럽을 찍게 될 것인지 아직 알 수 없습니다 ^^

얼마전에 리스본에서 PlugFest를 하자는 의견이 메일링리스트에 떴었지만 일정상 어려워 보이지요? PlugFest는 VESA에서 하는 PlugTest와 비슷한 것같은데, 말그대로 TX랑 RX랑 꼽아서 화면나오나 보자는... 안되면 개망신? ^^;;;

이번에 Demo를 할지 안할지는 상황봐야할듯요. 1년에 한번인 All Member Meeting이라 나름 의미는 있을 것 같은데 뭐 미리 Demo하겠다고 했다간 스스로 무덤파는 거니까 상황 좀 봐야지요

그리고 여행기라고할 정도의 거창한 건 없어요 ㅋ 끽해야 이태리에서 주차위반딱지 뗀거ㅋ
Name
Password
Homepage
  Secret
Description
 

Verilog Coding Style for Synthesis
Design | 2008/03/26 15:48
Verilog Coding Style for Synthesis[download]

"full_case parallel_case", the Evil Twins of Verilog Synthesis와 마찬가지로 C. E. Cummings씨가 SNUG99에 publish한 것이다.

빠듯한 일정속에서 RTL simulation을 마치고 합성 후 gate-level simulation을 했을 때, waveform view에 unknown value들이 빨간색으로 화면 가득채우고 있다면? OTL....

이 문서는 그런상황이 최소화되도록하기 위한 Verilog Coding방법을 설명하고 있다. 그러나, 몇가지 내용은 글쎄...

1. Incomplete sensitivity list
always블록의 sensitivity list에 입력 signal을 빠뜨려 latch가 발생된 경우는 칩 설계경험이 있다면 알만한 내용이다.

2. Complete sensitivity list with mis-ordered assignment
always블록 내에서 assignment의 순서가 뒤바뀐 경우. 즉, assignment들의 순서에 따라 결과가 달라지는 경우를 설명. 먼저 기술된 assignment의 결과가 나중 기술된 assignment에 사용되지않도록 순서를 정하라고하는데, 이것은 Non-blocking assignment를 사용하면 근본적으로 해결된다.

Donny's Guideline: always블록내의 모든 assignment는 non-blocking assignment를 사용한다.

즉, '=' 가 아니라 '<='를 사용하라는 의미이다. Concurrent한 동작이 일어나는 hardware을 sequential하게 기술하는 것 자체가 말이 안되기 때문이다.

3. Functions
Function을 잘못기술하면 latch가 발생된다는 내용. 그러나, 합성할 회로에 굳이 function을 사용할 필요가 있을까? 합성후 function은 말그대로 기능블록이 되어야하므로 차라리 별도의 module로 만드는 것이 구조적인 이해나 analisys가 쉽다고 생각한다.
Donny's Guideline: Synthesis할 부분에 대해서는 function을 사용하지 않는다.

4. Full Case / Parallel Case
"full_case parallel_case", the Evil Twins of Verilog Synthesis에 기술된 내용의 요약판.
Donny's Guideline: synopsys full_case나 parallel case directive를 사용하지 말자.

5. casex, casez
casex 대신 casez를 사용하라. casex의 경우 입력이 unknown('x')일 때도 정상적으로 동작하는 경우가 존재한다는 내용이다. casez의 경우에도 입력이 floating ('z')인 경우는 동작하지만 이런 경우는 덜 빈번하므로 casez를 쓰는 것이 좋다고 하는데... 과연??
RTL simulation만 할 경우에는 입력이 unknown상태가 될 가능성이 없으므로, RTL과 gate-level을 혼합하여 simulation하는 경우만 해당되는 내용이다.
반대로 casez를 사용하려면 don't care를 표기하기위해 'x'대신 '?'를 사용해야하는데, 복잡한 case문을 즐겨사용하는 내 경우엔 '?'사이에 섞여있는 '0'을 발견하기란 쉽지 않기 때문에 casex를 더 선호한다.

6. Assigning 'x'
'x'값을 입력시키면 simulator에선 'unkown'으로 인식되고, synthesizer에서는 'don't care'로 인식한다. 특별한 경우가 아니라면 일부러 'x'를 입력하는 일은 안하는게 상책.

7. translate_off/translate_on
이 directive를 사용하면 synthesizer에서 해당부분을 읽지(translate)도 않으므로 당연히 주의해서 사용해야한다. 주로 debugging과 관련된 code나 simulation model을 사용할 때 사용되는데, 가급적 debugging code는 testbench쪽으로 옮기면 위 directive를 사용할 일이 매우 적다.
Donny's Guideline: 합성할 code와 시뷸레이션할 code를 분리하여 가급적 translate_off / translate_on를 쓰지 말자.

8. Timing Delays
합성시 모든 timing 정보는 무시된다. (두말 하면 잔소리)
Donny's Guideline: Timing정보를 합성에 반영하고 싶다면 dc_script_begin/dc_script_end를 이용하여 code상에 constraint를 함께 기술하는 방법도 있다.

정리하자면 복잡하거나 특별해보이는 기능을 사용하여 설계하면 그만큼 문제가 발생할 소지가 크다는 것이다. 이러한 guideline을 준수하여 code를 작성한다면 시행착오를 어느정도 줄일 수 있다.

하지만, 아무리 HDL이란 언어를 잘 사용하더라도 회로를 설계하는 것은 C프로그램을 작성하는 것은 차이가 많기 때문에 언어이외에 회로에 대한 개념을 숙지하는 것이 필수적이다.

이러한 복잡한 Guideline보다도 더 강력한 방법이 있는데 Synopsys의 HDL Compiler를 사용하는 것이다. Design Compiler에서 Verilog코드를 읽어들이면 화면에 글씨들이 잔뜩지나가는데 처음에는 대개 이 내용을 무시한다. 하지만, 그 내용이 HDL Compiler의 합성결과이고 합성시 문제가 될만 한부분을 미리 다 알려준다. 즉, case statement가 full case인가 parallel한가 latch가 생성되는가 flipflop이 생성되는가 모든 정보를 알 수 있다.

따라서, 이 내용을 무시하고 합성후 gate-level simulation을 하는 것은 미리 알 수 있는 문제를 확인사살하는 시간 낭비일 뿐이고, 주의깊게 결과를 확인하지않으면 문제를 방치한채로 Tape-out하는 최악의 상황에 이를 수 있다.

의도치 않게 latch가 생성되었는데 이 latch의 입력을 testbench에서 바꾸어보지 않는다면, latch의 영향이 나타나지 않는다. Code Coverage를 확인하여 문제를 찾는 방법도 있겠지만, 처음부터 RTL 코드 작성을 잘하고 합성시 HDL Compiler결과만 확인한다면 근본적으로 문제를 해결할 수 있다.
Donny's Guideline: HDL Compiler결과를 꼼꼼히 확인하자
2008/03/26 15:48 Donny 

, , ,
sooy 2008/03/31 15:55
동감합니다. 실제 verilog접한 경험도 짧지만, (경험을 기반으로 한) 제 나름대로의 guideline을 조목조목 잘 정리해주셨네요. 그러고보면 결국 가야할 길은 하나인가 봅니다^^;

저 위의 guideline에 덧붙여 제가 주의하고자 하고 강조하는 부분들은 가능하면 combinational / sequential logic을 분리해서 설계하자입니다. 그만큼 coding시, gate-level로 어떻게 구성될 것인지까지 고민하다보면 뒤에서 삽질이 줄어들겠죠.(향후 debugging에도 용이하고요.)
+ always 안의 case나 if-else state사용할 때는 생성하고자 하는 signal의 모든 state를 빠짐없이 정의해주기를 요구합니다. 다소 번거롭고, 귀찮을지도 모르지만 발생가능한 모든 상태에 대해서 그 state를 정의해주지 않았다가 발생된 사건들을 보면...
donny 2008/04/01 08:54
결국 만들고자하는 것이 회로이기 때문에 가장 확실한 방법을 선호하게 되는 거겠죠.

combinational / sequential을 분리하는 것 역시 중요한 부분이지요. 저도 비슷한데 flip-flop을 발생시키는 always block에는 else if를 한번 이상 안쓰고, else if나 case가 필요한 부분은 별도의 combinational logic으로 만듭니다.

case와 if-else의 기술이 사실 매우 중요하지요. else-if tree가 한번 이상 갈라지면 else-if condition에는 한가지 조건만 써야합니다. 두가지 조건을 조합하면 dependency가 생겨 unreachable statement가 발생할 가능성이 높아지죠.

우주임이 언급한 "모든 state를 정의"는 if-else가 아닌 case일 때 full-case를 기술하는 것과 같은 맥락이고, 제가 말한 unreachable statement는 parallel하지 않은 case문과 같은 의미죠.

제 경우 복잡한 if-else문은 condition간의 관계가 한눈에 안들어오기 때문에 case문을 선호합니다. 덕분에 제가 짠 코드는 무슨 기계어 같습니다. 제 background가 마이크로프로세서라서 마이크로코드를 사용하는 것과 같은 컨셉을 사용합니다. ^^
anna 2008/04/02 16:21
도대체 두분이서 이렇게 글쓰고도
대화가 통하신단 말씀이세요??
오~지저스 지저스!

제가 보기엔 그저 연극에서나 나오는
말도 안되는 언어 유희로 개그를 하는것 처럼 보인다요~

donny 2008/04/02 16:40
위엣분 공부 좀 시켜야겠네요 ㅋ
Velvio 2009/07/09 16:47
Verilog don't care case로 Google 검색하니 이 페이지가 제일 먼저 뜨네.
반갑고 신기하구먼.
근데 첨부 파일에서는 ?를 쓰라는 것 같은데 넌 x를 더 선호한다고라...

donny 2009/07/11 23:31
관련된 검색어로 구글에서 검색하면 대체로 상당히 우선 순위를 갖고 검색되더라구요. 10년 넘은 도메인이라서 그런가? ㅎ
donny 2009/07/11 23:32
참... don't care로 x를 쓰거나 ?를 쓰는 것은 큰 의미는 없다고 봅니다. x가 가독성이 좋아서 x를 선호합니다. ㅎ
babyworm 2009/08/05 11:10 
X의 경우 받아들이는 경우가 더 많아서, casez와 ?를 조합하는 것이 더 안전하다고 알려져 있습니다.
일례로, case문을 결정하는 입력이 unknown인 경우 casex와 x를 조합하는 경우 mathcing이 일어나기 때문에 에러처리가 불가능하죠 :)
Functional Simulation에서의 unknown은 대부분 memory model에서 발생하더군요.
Name
Password
Homepage
  Secret
Description
 

BLOG main image
Chip Designer, Donny (drdonny@gmail.com)
전체 (133)
Portfolio(Eng.) (20)
Design (8)
Microprocessor (11)
Verification (5)
Technology (7)
Lecture (13)
Silicon Valley (2)
Travel (6)
Family (37)
KoreaInlineCup (1)
Donny Thinks (23)
Wishlist (0)
Microprocessor 재희 MIPI 마이크로프로세서 집적회로설계 DSI DDI 두개골 유합증 Verilog ARM MDDI Synthesis Qualcomm 인테리어 Display Driver IC HSSI 애플 재인 simplecore Synopsys
2011/10
2011/03
2011/01
2010/12
2010/11
이미 늦었을..
    01/20 - 지금쯤이면...
좋은 자료 ..
    01/10 - estwingz
좋은자료 감..
    2011 - 최수연
iverilog lf..
    2011 - 아놔
좋은 자료 ..
    2011 - 김두상
반도체, 칩..
    2009 - :::: for Ne..
Synopsys 버..
    2008 - Processor A..
Coding styl..
    2008 - Processor A..
Dreamer GUN..
Natural Bor..
Processor A..
지극히 개인..
64
63
125821

태터툴즈 배너