|
[Verilog] 새로 컴파일하지 않고 테스트 입력/조건을 바꾸는 방법
Verification |
2010/10/28 13:06
|
|
|
Compiled-code방식 Verilog 시뮬레이터는 크게 세단계로 동작합니다.
- Compile: Verilog Code의 문법을 체크하고, 해석하고(parse/analyze)하고 Compile한다.
- Elaboration: 계층구조(design hierarchy)를 구축하고 신호들을 연결하고 초기값을 계산한다.
- Simulation: 회로의 동작을 시뮬레이션한다.
복잡하게 나누어 생각하고 싶지 않은 분들도 계실텐데, C프로그램을 해보신 분들이라면 쉽게 이해할 수 있습니다.
- Compiler: C컴파일러를 이용해서 C 코드를 Object코드로 만드는 것과 유사합니다.
- Elaboration: Object코드를 Linker로 연결해서 실행화일(Executable)을 만드는 것과 유사합니다. C Code건, 어셈블리코드건 언어에 관계없이 Object코드는 동일한 것과 같이 Elaboration은 VHDL와 Verilog를 구분하지 않습니다.
- 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  |
|
|
|
Design,
Simulation,
Verification,
Verilog |
|
|
|
 |
| Trackback http://www.donny.co.kr/tt/trackback/146 |
|
 |
|
|
OpenSparc Coding Style
Microprocessor |
2010/10/22 17:20
|
|
|
| OpenSparc을 좀 들여다 보기로 하고선 진도가 잘 안나가네요.
제가 OpenSparc에서 관심 가졌던 부분은 몇가지가 있습니다. 그중 한가지가 코딩 스타일입니다.
참고로, 소스코드를 다운로드하지 않아도 Web으로도 간단히 T1과 T2의 코드를 직접 확인하실 수 있습니다.
먼저 Naming Convention입니다.
방대한 분량 (T1의 경우 33만6천라인)의 설계를 하기 위해선 분명 적지않은 개발자가 참여했으므로 체계적이고 명확하고 효율적인 Naming Convention이 존재하리라 기대했으나 기대했던 수준은 아닌 것 같습니다.
인상적인 부분 몇가지는 signal name과 module name이 상당히 깁니다. 특히 module name이 긴데 'sparc_exu_aluadder64' 정도의 길이는 보통입니다. 명확한 대신 한눈에 안들어온다는 단점, module name을 입력할 때 수동으로 입력하면 틀리기 십상이라 반드시 자동완성 기능을 사용해야 되겠더군요.
특징적인 부분은 always문이 매우 적은 빈도로 사용되어있습니다.
flip-flop이 필요한 곳은 아래와 같이 D flip-flop을 가져다가 사용하고 있기 때문이긴 하지만 상당히 의외네요. 그렇다면 FSM(Finite State Machin)을 어떻게 구현했나 찾아보니, 일반적인 FSM 형태로 구현된 부분은 Thread State Machine과 Miss Instruction List State Machine 두개 밖에 없군요. wire [1:0] thrid_m, thrid_g ;
dff #(2) stgm_thrid (
.din (ifu_tlu_thrid_e[1:0]),
.q (thrid_m[1:0]),
.clk (clk),
.se (1'b0), .si (), .so ()
);
dff #(2) stgg_thrid (
.din (thrid_m[1:0]),
.q (thrid_g[1:0]),
.clk (clk),
.se (1'b0), .si (), .so ()
);
dff stgw_ivld (
.din (flush_w_inst_vld_m),
.q (lsu_inst_vld_tmp),
.clk (clk),
.se (1'b0), .si (), .so ()
); 이렇게 버스 단위로 D flip-flop을 instanciation하거나
dff #(4) ivld_stgw2 (
.din ({ld0_inst_vld_g,ld1_inst_vld_g,ld2_inst_vld_g,ld3_inst_vld_g}),
.q ({ld0_inst_vld_w2,ld1_inst_vld_w2,ld2_inst_vld_w2,ld3_inst_vld_w2}),
.clk (clk),
.se (1'b0), .si (), .so ()
);
dff #(4) th_stgm (
.din ({thread0_e,thread1_e,thread2_e,thread3_e}),
.q ({thread0_m,thread1_m,thread2_m,thread3_m}),
.clk (clk),
.se (1'b0), .si (), .so ()
);
dff #(4) th_stgg (
.din ({thread0_m,thread1_m,thread2_m,thread3_m}),
.q ({thread0_g,thread1_g,thread2_g,thread3_g}),
.clk (clk),
.se (1'b0), .si (), .so ()
);
dff #(4) th_stgw2 (
.din ({thread0_g,thread1_g,thread2_g,thread3_g}),
.q ({thread0_w2,thread1_w2,thread2_w2,thread3_w2}),
.clk (clk),
.se (1'b0), .si (), .so ()
); 이렇게 concatenation해서 flip-flop을 연결합니다. 이런 coding style은 datapath의 pipeline register를 기술할때 특히 효과적이겠네요.
OpenSparc T2는 어떤가 하고 조금 살펴보니, T1보다 훨씬 module name이 길고 직접 dff을 가져다 쓰는게 아니라 module을 한겹 덧씌워서 unique하게 만들어 사용하는군요. module spc_lb_ctlmsff_ctl_macro__width_15 (
din,
l1clk,
scan_in,
siclk,
soclk,
dout,
scan_out);
wire [14:0] fdin;
wire [13:0] so;
input [14:0] din;
input l1clk;
input scan_in;
input siclk;
input soclk;
output [14:0] dout;
output scan_out;
assign fdin[14:0] = din[14:0];
dff #(15) d0_0 (
.l1clk(l1clk),
.siclk(siclk),
.soclk(soclk),
.d(fdin[14:0]),
.si({scan_in,so[13:0]}),
.so({so[13:0],scan_out}),
.q(dout[14:0])
);
endmodule 또 한가지, T2는 제가 알고 있던 상식을 깨고 있었는데, 위의 macro module을 잘 보면 scan input, scan output까지 연결하고 있습니다.
네 그렇습니다. 이런 식의 register macro들을 모두 연결하여 RTL상에서 scan chain을 구성하고 있었습니다. T1만 하더라도 scan chain은 합성단계에서 auto insertion하고 있었던 것으로 보이는데, 다음 세대인 T2는 RTL에서 scan chain을 모두 stich해두었는데... 이것 참 어떻게 받아들여야할지?(T1, T2가 모두 그렇다면 Sun의 전통(?)이겠거니 할텐데 그것도 아니고 말입니다.)
혹시 수십,수백만 게이트 짜리 디자인의 scan-chain을 manual stitch한다는 얘기 들어보신분? 2010/10/22 17:20 Donny  |
|
|
|
| |
|
|
|
 |
| Trackback http://www.donny.co.kr/tt/trackback/143 |
|
 |
|
|
아이폰 LCD와 갤럭시S AMOLED 현미경 비교
Technology |
2010/10/11 19:15
|
|
|
| LCD와 AMOLED Display를 비교하는 글들이 국내 및 국외 싸이트에 많이 있습니다.
특히 iPhone 4의 Retina Display와 Galaxy S의 Super AMOLED의 화질을 비교하는 글들이 많이 있습니다.
스마트폰별 디스플레이 특성 비교해 놓은 자료 중 http://www.displaymate.com/Smartphone_ShootOut_1.htm 가 매우 상세하고 객관적이니 참고하시기 바랍니다.
화질에 대한 평가는 개개인의 선호도에 따라 다른 부분이고, 저는 디스플레이 업계에 몸담고 있는 입장에서 각 패널들의 실제 Pixel구조가 궁금해서 비교해 보았습니다.
iPhone 3Gs는 @KyonghoKim 님, iPhone4는 @OyPark 님, Galaxy S는 @LimGyuHo 님께서 빌려주셨습니다. 촬영하려고 보니 Galaxy S는 AMOLED를 사용한 폰들이 그렇듯 UI화면이 모두 Black이라 살짝 고민하다가 Google 웹싸이트에 접속했습니다.
본래 계획은 15배율의 LUPE에 대고 아이폰으로 찍으려고 했는데, 15배로 픽셀구조가 보이는 3Gs와 Galaxy S에 비해 iPhone 4는 전혀 픽셀구조가 보이지않아서, Probe Station에 있는 현미경을 사용하였습니다.
아래는 각 패널을 모두 같은 배율로 촬영하고 한눈에 비교가되도록 배치한 것입니다. 척보기에도 차이가 많이 납니다.
각각 좀더 자세히 살펴보겠습니다.
먼저 iPhone 3Gs는 가장 보편적인(보통의 LCD 모니터와도 동일한) RGB Stripe구조입니다.
그중에서도 IPS LCD(In Plane Switching Liquid Crystal Displays) 방식을 사용하고 있습니다.
백색LED 백라이트가 있고 Color Filter로 붉은색, 녹색, 푸른색 성분을 선택적으로 투과시키는 방식입니다.
다음으로 Galaxy S는 이제는 많은 분들이 알고 계신대로 PenTile구조라 한개의 pixel이 RGB sub-pixel로 구성된 것이 아니라 red+green과 blue+green이 교대로 픽셀을 구성하는 방식입니다.
AMOLED(Active Matrix Organic Light Emitting Diodes)는 유기물질이 자체발광하는 방식입니다.
픽셀구조를 보면 녹색 sub-pixel의 면적이 제일작고, 붉은 색은 중간, 푸른색이 가장 면적이 큰 것을 알 수 있습니다.
붉은색과 푸른색은 두 pixel마다 하나씩 있지만, 녹색은 모든 pixel에 존재하므로 모든 sub-pixel이 빛을 발할 때 흰색이 되기 위해선 각각의 녹색 sub-pixel은 50%의 밝기를 가져야합니다. 따라서 녹색의 면적이 제일 작아야할 것이고, 자체발광하는 유기물질의 휘도 특성에 차이가 있어서 면적이 다른 것 같습니다. 즉, 푸른색을 내는 유기물질의 휘도(밝기)가 제일 낮다는 말이지요. 사실 제가 패널 엔지니어가 아니라 정확히는 모릅니다. 그리고, 유기물질이 동일한 휘도를 낸다고 하더라도 사람의 눈이 받아들이는 빛의 양은 색상마다 차이가 있는 것도 고려했을 것입니다.
3Gs의 LCD Panel에 비해 빛을 내는 부분이 상대적으로 적습니다. 즉 개구율(Aperture Ratio)가 상대적으로 작은데 이것은 AMOLED에 상대적으로 회로가 많이 필요하거나 아니면 필요이상의 전류소비를 막기 위한 것 같습니다. 지금도 AMOLED가 밝다고 하지만, 배터리문제만 극복한다면 더 밝게 만드는 것도 가능해보입니다.
참고로, AMOLED보다 LCD방식이 어둡다고 말하는 이유는 위에서 잠시 설명한 color filter, 편광판 등을 통과하면서 본래의 흰색 광원보다는 어두워질 수 밖에 없고, AMOLED는 자체적으로 색상을 발광이기 때문에 밝기가 감소되지 않고 그대로 보이기 때문입니다. 하지만, AMOLED는 밝은 화면에서 소비전류가 커지므로 밝기를 제한하기 때문에 AMOLED가 LCD보다 더 밝다고 말하긴 어렵습니다.
다음으로 iPhone 4의 Pixel구조는 이런저런 추측이 있었는데 3Gs와 마찬가지로 IPS 패널이고 Pixel구조자체도 큰 차이가 없어보이나 Pixel크기가 3Gs의 1/4밖에 되지않습니다.
한가지 특이한 점을 발견했는데, 군데군데 푸른색 sub-pixel 한쪽에 까만 점이 보입니다. 어떤 회로를 추가했다는 의미인데 그게 무엇인지는 모르겠습니다. 같이 사진을 살펴보던 @starrida 님은 포토센서(밝기 센서)가 들어갔을 거 같다고 하셨습니다.
마지막으로 패널별로 픽셀크기를 비교해 보겠습니다.
픽셀크기는 해상도와 화면크기만으로 계산이 가능하고 또 자료를 찾아보면 iPhone 3gs: 163ppi, Galaxy S: 233ppi, iPhone 4: 326ppi (ppi: Pixel Per Inch)인 것을 알 수 있지만 직관적으로 비교할 수 있는 그림을 그려보았습니다.
당연한 얘기지만 픽셀크기가 작을 수록 화면이 더 조밀하고 또렷하게 보입니다.
iPhone 3gs, iPhone3, Galaxy S의 화면 구조에 대하여 비교해보았습니다.
서두에 말한 것 처럼 어느 제품의 화질이 더 나은지는 언급하지 않겠습니다. 각각 장점도 있고 단점도 있으니까요. 색재현률, 시야각, 소비전력, 명도 대비 등의 비교는 이 곳 자료를 참고하세요.
여담이지만 2010년에 휴대폰에 960x640 해상도가 사용될 것이란 것은 디스플레이용 반도체를 만드는 저도 정말 상상하지 못했던 일이었습니다. 작년에 거의 같은 해상도의 제품을 만들긴 했지만...
"설마 이렇게 고해상도가 필요하겠어? 패널수율도 안나오는데... 만들어도 얼마나 팔릴까?" 라고 생각하고 있었습니다. 이거 머잖아 정말 핸드폰에 HD화면이 들어갈 상황입니다.
이러한 경쟁으로 인해 눈부시게 빠른 기술발전이 되면 소비자들은 행복합니다. 대개 성능차이에 비해 가격차이는 적은 편이거든요. 날로 높아지는 눈높이 맞추느라 고생하시는 개발자 분들 힘내시란 말로 마무리하겠습니다.
@0donny 2010/10/11 19:15 Donny  |
|
|
|
AMOLED,
Retina Display,
갤럭시S,
아이폰3Gs,
아이폰4 |
|
|
|
 |
| Trackback http://www.donny.co.kr/tt/trackback/141 |
|
 |
|
|
| Chip Designer, Donny
(drdonny@gmail.com) |
|
|
 |
| 64 |
| 64 |
| 125822 |
 |
|
|
|