수요일, 10월 01, 2014

[2014-2/VLSI-DA] 4주차, 직감적으로 이해하는 베릴로그 테스트 벤치

[2014-2/VLSI-DA] 4주차, 직감적으로 이해하는 베릴로그 테스트 벤치


[VLSI-DA/W04] Intuitive Verilog HDL TestBench

Hi All,
Last week we briefly look at testbench written in Verilog HDL. Surely, we're just begin of this design methodology and less or none experience of this hardware design language, Verilog. But, I'm urging you to remind what you have learned before about computational languages. Verilog HDL is another set of the computational language but its goals is different, hardware or software.

Today we'll explore HDL simulation techniques by reading testbench intuitively, and give you homework about writting testbench for your DUT, submitted last week.

이번 주에는 지난 주에 나눠준 베릴로그 테스트 벤치를 한줄 한줄 씩 읽어봤다

http://goodkook.blogspot.kr/2014/09/20142vlsi-da-3-basics-of-verilog-hdl.html

이제 겨우 베릴로그 배운지 3주에 불과하지만 다소 수준있는 예제를 읽어봤다. 베릴로그가 별거랴. 이제껏 배운 컴퓨터 언어의 개념을 총동원하면 직접 작성은 못해도 해놓은 것 읽고 이해 할 수는 있었을 것이다. 이번 학기 수업을 마칠 때 쯤이면 이정도 베릴로그는 구사할 수 있게될 것이라고 기대해본다.


월요일, 9월 29, 2014

좀 낭만적으로 죽었으면 좋겠다...

좀 낭만적으로 죽었으면 좋겠다...

어느 아동문학가의 유언장에 쓰인 글귀라고 합니다. 돌아가실때 까지 5평 움막에 사셨다고 합니다. 가난한 문학가 였냐구요? 천만에, 바로 "강아지똥", "몽실언니" 같은 베스트 셀러의 작가인 권정생 선생님입니다.

[도종환 칼럼] 권정생 선생의 다섯평 흙집
http://djhpoem.co.kr/board/?c=3_product/3_8&p=2&uid=661

[나무위키] 권정생
https://namu.wiki/w/%EA%B6%8C%EC%A0%95%EC%83%9D

[위키백과]
https://ko.wikipedia.org/wiki/%EA%B6%8C%EC%A0%95%EC%83%9D

어재 인터넷 어느 카페에서 주최하는 "귀농 귀촌 집짓기"에 관한 세미나에 다녀왔습니다. 건축 업자에게 "눈탱이" 맞지 않는 것이 최선이라 하네요. 그러려면 뭘 알아야 한다고. 집짓는 것이 그리 만만하지 않을 것이라는 생각은 해왔지만 역시 엄두가 나지 않습니다.

처음에는 그냥 소박하게 움막 수준이면 좋겠다고 생각 했습니다. 작은 책상 하나 놓을 만한 크기의 집과 맑은 날 밤 별을 볼 수 있는 하늘과 작은 텃밭이면 좋으리라.

그러다 하나둘 욕심이 더해지더군요. 거실과 침실따로, 편리한 주방, 벽난로, 완벽한 난방과 통풍이 잘되야 하고, 겨울에는 따뜻하고 여름엔 시원한 곳. 따로 나만의 작업실을 두어야지. 결국 이십평... 삼십평... 건평이 늘고, 덩달아 생활비 예상도 지금과 진배 없습니다. 결국 대답은 쉽게 했지만 앞으로 뭐하며 살게? 라는 질문이 무겁습니다. 소박했던 움막은 온데간데 없고 저택에 눌려 있네요. 이 허세를 맞춰 줄 땅이 있을리 만무하구요.

도시 생활만큼이나 우아하게 살길 바라면서 입으로는 낭만이라며 애써 우기고 있습니다. 그만 두고 싶다가도 다시 엄한 궁리를 해보는 것은 콘크리트 탑 중간층에 끼여 지내기가 싫어진 까닭입니다.  이게 다 늙어가는 탓이겠지요?

화요일, 9월 23, 2014

[이번주 밤하늘] 2014년 9월 19일부터 27일까지

[이번주 밤하늘] 2014년 9월 19일부터 27일까지

*이 글은 "Sky and Telescope" 지의 웹 페이지에 매주 게시되는 "This Week's Sky at a Glance"를 요약한 것 입니다. 맨눈으로 관측할 수 있는 가벼운 관측정보입니다. 가끔 사견과 경험 그리고 부가 정보를 겯들입니다.

참조 원문: http://www.skyandtelescope.com/observing/weeks-sky-glance-september-1927/#sthash.cUeYG6Ya.dpuf

2014년 9월 19일(금요일)

토요일 아침 이른 새벽, 동편 하늘에 목성이 하현달 왼쪽 위에서 빛납니다. 망원경을 목성과 바다로 가득한 초승달과 하현달을 향한지 얼마만인가요? 봄-여름의 행성인 토성은 작별을 고하고 이제 목성을 관측하기 좋은 겨울이 다가옵니다. 목성은 깊은 겨울밤이면 동쪽 하늘에 볼 수 있고, 초여름까지 초저녁부터 서쪽하늘에서 보일 겁니다.

Farewell Saturn
http://www.skyandtelescope.com/astronomy-news/observing-news/tour-septembers-sky-farewell-saturn-08312014/

* 행성의 공전 주기가 서로 다른 탓에 지구의 계절에 따라 관측할 수 있는 행성은 달라집니다. 앞으로 5년후면 공전 주기가 11년 가량인 목성은 현재 지구위치의 반대쪽에 놓이므로 여름에 관측 가능할 것이고, 토성은 늦가을 까지 관측 가능 합니다. 10년 후에 공전 주기가 29년 가량인 토성은 겨울에 관측할 수 있는 행성이 됩니다. 목성은 태양을 한바퀴 돌아 지금의 위치에 놓이므로 다시 겨울 행성이 되겠구요.



2014년 9월 20일(토요일)

황혼이 아직 남아 있을 때 수성과 희미한 스피카(Spica, 처녀자리)가 약 0.6도 가량 떨어져 있는 것을 남서쪽 수평선 가까이에서 볼 수 있습니다. 해가진 후 20분 가량 쌍안경을 가지고 수평선을 훓어 보세요.

식 변광성(eclipsing variable star, 쌍성계을 이루는 두개의 별인데 지구에서 보는 시선 축상에 두 별의 위치가 일치되어 밝기가 달라보이는 것)인 알골(Algol, 페르세우스 자리 Persei 베타별)이 최소 광도가 됩니다(시각은 미국동부 표준시 밤 10시 55분경). 일반적인 밝기 2.1등성에서 3.4등성으로 어두워 질 것 입니다.

21일 일요일 새벽에 하현달이 목성 아래와 레귤러스(Regulus, 사자자리 Leo)의 옆에 떠있을 겁니다.

2014년 9월 21일(일요일)

독수리 자리(Aquila)의 검은 비밀: 정말 어두운 곳에 갈 수 있는 기회가 있다면 독수리자리(Aquila)의 알테어(Altair) 근처에 "버나드 E(Bernard's E)"라고 알려진 암흑성운(dark nebula)을 찾아보세요. 게리 세로닉(Gary Seronik)이 쓴 "쌍안경으로 관측할 수 있는 주요 대상(Binocular Highlight"의 65쪽을 참조하세요. 달도 없는 칠흙같이 어두운 곳에 가야 볼 수 있을 겁니다.

(독수리 자리의 배경에 은하수가 지나갑니다. 은하수를 쌍안경으로 보면 마치 소금을 뿌려놓은듯 하죠. 알테어에서 약 3도가량 윗쪽에 마치 영어 대문자 E 처럼 생긴 별이 없는 영역이 보일텐데 바로 "버나드 E"라는 암흑성운이 가리기 때문입니다. 정말 어두운 곳에 쌍안경을 삼각대에 고정해 놓고 한참 살펴봐야 보일지 모르겠네요.)

참고: 게리 세로닉(Gary Seronik)씨는 유명한 아마추어 천문가 입니다. "스카이 앤드 텔리스코프"를 비롯한 여러 잡지에 기고글도 씁니다. 망원경을 자작가 이기도 하죠. 그의 블로그를 방문해보면 재미있는 사진과 휴대용 돕소니언 망원경이나 "창고문 형 별 추적기(Barn-Door Star Tracker)" 같은 자작기를 볼 수 있습니다.

A Place for Stargazing Enthusiasts
http://www.garyseronik.com/

Binocular Highlights
http://www.amazon.com/Binocular-Highlights-Celestial-Sights-Users-ebook/dp/B00HM8YWUC/ref=sr_1_1?s=books&ie=UTF8&qid=1411430366&sr=1-1&keywords=binocular+highlights

정말 어두운 곳이라면 백조자리(Cygnus)의 일등성 데네브(Deneb)의 주변을 감싸고 있는 "북 아메리카 성운(North America Nebula)"도 찾아보세요.어둡지만 아주 넓게 분포하고 있습니다. (성운은 밝은 별이 내는 빛이 주위의 우주먼지에 반사되어 희미하게 빛나 보이는 겁니다. 이런 성운을 보려면 정말 어두워야 합니다. 쉽게 볼 수 있는 성운으로 오리온 대성운이 있습니다.)

2014년 9월 22일(월요일)

9월은 추분(equinox)이 있는 달입니다. 우리나라(한국)의 추분은 9월23일 11시 29분입니다. 태양이 매 년 천구 적도를 지나 남쪽으로 내려가기 시작하는 겁니다. (봄의 춘분은 남쪽에서 적도를 지나 북으로 올라가는 시점) 북반구에서 본격적으로 가을이 시작하게 되는 거죠. 남반구에서는 봄의 시작이 되겠군요. 낮과 밤의 길이가 같아지고 태양이 정확히 동쪽에서 떠서 서쪽으로 지는 날이기도 하죠.

여름이 끝나가니 궁수자리의 찻주전자(Sagittarius Teapot)도 초저녁에 남쪽 하늘 낮게 드리워 가는 여름을 쏟아내는 모습입니다.

2014년 9월 23일(화요일)

아크투러스(Arcturus, 목동자리 Bootes)가 어둠이 내린 후 서쪽하늘 낮게 떠있습니다. 주황색의 아주 밝은 별인데 37광년 떨어진 적색거성입니다. 그 오른쪽으로 큰 국자(Big Dipper)가 북서쪽을 향하고 있는데 이별들은 80광년 가량 떨어져 있습니다.

동부표준시(EDT, 미국) 오후 7시 44분부터 식 변광성인 알골(Algol)이 가장 어두운 채 몇시간 지속됩니다.

2014년 9월 24일(수요일)

화성이 전갈지리(Scorpius)의 일등성 안타레스(Antares)에 4도이내로 접근하다 이달 말까지 북쪽으로 오릅니다. 화성은 안타레스에 비해 약간 밝지만 색깔이 거의 비슷해서 고대 그리스어로 "Antares"는 "Anti-Mars"라는 뜻을 가지고 있습니다.


2014년 9월 25일(목요일)

가을이 다가오면서 천정의 밝은 별은 베가(Vega, 거문고자리 Lyra)에서 데네브(Deneb)로 바뀌어 갑니다.





 가을로 가는 "여름의 대삼각형"

2014년 9월 26일(금요일)

저녁 8시나 9시경 포말하우트(Fomalhaut,남쪽 물고기 자리 Piscis Austrius)를 찾아보세요. 남쪽 지평선 위에 반짝이는 1등성으로 가을의 외톨이 별이라고도 합니다. 한밤에 가장 높은 고도(약 20도)에 올랐다가 이내 집니다.

2014년 9월 27일(토요일)

이달 말까지 초저녁 남서쪽 낮게 화성과 안타레스가 3도 이내로 접근합니다.

9월 28일 오전 12시 낮달을 볼 수 있겠는데 이때 토성이 달 뒤로 숨는 모습을 관측할 수 있을지도 모릅니다. 물론 아주 좋은 망원경(혹은 쌍안경)을 가지고 있어야 겠지요. 해가 있는 낮에 관측할 수 있는 천체 대상으로 달이 유일 합니다만 매우 드믈게 행성을 볼 수 있습니다.




월요일, 9월 22, 2014

안드로메다 대성운을 제대로(?) 사진에 담아보다.

안드로메다 대성운을 제대로(?) 사진에 담아보다.

일만 하는 자의 책상이라는 무시무시한 글을 올린 후 지난주와 지지난주는 바빴습니다. 뭐 그렇다고 일하느라 그런건 아니었습니다. 중간에 추석 기간도 끼어 있었구요.

발명품, 일만하다 죽을 자에게 최적화된 책상
http://goodkook.blogspot.kr/2014/09/blog-post_3.html

이번 학기에도 강의를 금요일밤으로 잡았습니다.
http://goodkook.blogspot.kr/2014/09/2014-2vlsi-da-2.html

강의 마치면 밤 8시반 입니다. 하늘을 보고 날씨가 맑으면 냅다 별보러 갑니다. 지지난주(9월13일)에는 양평에가서 혼자 2박3일 놀다왔네요. 지난 주(9월20일)에는 부모님 모시고 홍천에 다녀왔구요. 역시 양평보다 홍천의 하늘에 별이 총총합니다.

요즘은 늦은 저녁 동쪽하늘에 페가서스와 안드로메다가 멋집니다. 아래 사진에서 안드로메다 대성운을 찾아보아요. (사진 다운로드해서 원래크기로 보며 찾을 것)

[안드로메다 대성운 찾기, NEX-5/16mm/f2.8/ISO1600/10sec,양평 지평면]

별자리 찾기 힌트(그림 다운로드해서 원래크기로 볼 것)

망원렌즈로 찍어봤습니다. 중간에서 우측 위에 솜털(?)이 보이죠! 그게 안드로메다 대성운입니다. (S-Tracker 사용)

[안드로메다 대성운, NEX-5/206mm/f6.3/ISO3200/10sec,양평 지평면]

감도를 높이고 시간을 조금 늘였습니다. 별이 위아래로 도는 모습이 보이죠.

[안드로메다 대성운, NEX-5/206mm/f6.3/ISO12800/15sec,양평 지평면]

천체 대상이 흐르지 않고 장노출로 찍으려면 추적기가 필요합니다. 자작한 추적기를 가동하여 같은 조건으로 찍어봤습니다. 이번에는 약간 좌우로 흐르네요. 극축을 정확히 맞추지 못한데다 추적기 회전 속도도 맞지 않았기 때문입니다. 어쨌든 추적기 동작은 쓸만 합니다.

Barn-Door Style S-Tracker

[안드로메다 대성운, NEX-5/206mm/f6.3/ISO12800/15sec,양평 지평면] 


처음 시도해본 타임랩스. 많이 우습긴 하지만 처음 시도해봤습니다. 사진[NEX-5/16mm/f2.8/ISO1600/2sec] 겨우 7장으로 만들었습니다. 리모콘 가지고 시간 재서(Time Laps) 수십장의 사진을 찍는 것은 불가능합니다. 주기적으로 사진을 찍을 수 있는 IR 리모콘을 만들어야 겠습니다.


물론 천정에 여름 별자리는 여전합니다. 보일락 말락하는 은하수와 백조자리.

[보일락 말락 은하수, NEX-5/16mm/f2.8/ISO1600/20sec,양평 지평면]

새벽에 남쪽하늘의 오리온 자리가 떠있네요. 쌀쌀한 것이 가을이 느껴집니다. 아래 사진은 Orion Nebula,M42을 찍은 겁니다. 오리온 대성운이 보이나요? 사진을 다운 받아서 확대해서 봐야 뭔가 보일 겁니다.

[오리온 대성운,NEX-5/210mm/f6.3/ISO1600/4sec,양평 지평면]

오리온 대성운 타임랩스 시도해 봤습니다. 멋진 오리온 대성운 사진을 상상하며 시간별로 별이 옆으로 지나가는 구나... 라고 생각해 주세요. ^^

[2014-2/VLSI-DA] 3주차 " Basics of Verilog HDL"

[2014년2학기/VLSI-DA] 3주차 " Basics of Verilog HDL"

[VLSI-DA/W03] Basics of Verilog HDL

- How to simulate concurrent execution in the HDL which is a kind of computer language ?
- Blocked or Non-Blocked assignment in Verilog HDL.
- Design example "Synchronous MOD-10 Counter"
All student must submit "HOMEWORK 01" as printed form before today's class. We'll talk with your submitted homework.
- Basics of Testbench
- HOW to use ICARUS Verilog Simulator
Find attached files for your self-study.

Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!

수업에 사용할 Verilog 시뮬레이터는 ICARUS iVerilog 입니다. 상용 시뮬레이터는 고가입니다. 학습용으로 손색이 없는 무료 시뮬레이터 입니다. 이런 소프트웨어를 개발하는 이들에게 감사 합니다.

리눅스용 이지만 윈도우즈 용도 있습니다.

iVerilog User Guide WiKi

수강생 중에 HDL의 경험이 없는 학생이 90%가 넘습니다. 그렇다고 대학원 수업에서 문법과 구문을 하나하나 가르칠 수는 없습니다. 일단 HDL도 컴퓨터 언어의 하나이며, 그 근원은 자연어(영어)와 기초 대수라는 점을 인식 시킵니다. 각 언어마다 형식의 차이가 있을 뿐이라는 점도 쉽게 전달 됩니다.

예를 들어 "if" 라는 영어 단어를 모를리 없죠. 이 단어가 컴퓨터 언어에서 쓰이는 용도도 금방 이해합니다. C언어에서나 Verilog 언어에서나 용도는 다르지 않습니다. 자신의 생각(아이디어 혹은 알고리듬)을 가지고 있어야 합니다. 언어는 그저 도구일 뿐이라는 점입니다. 도구와 기법은 알려줄 터이니 생각을 가지라고 말해 줍니다.

수업이 Verilog HDL을 접해보지 않았다는 학생들에게 첫 과제로 너무 어려운 과제일지 모르지만 그동안 배워온 지식을 동원해 보기로 합니다.

먼저 16-비트 카운터를 DUT(Design Under Test) 삼아 설계해 봅니다.

//-------------------------------------------------
// File: count16.v
// Purpose: Verilog Simulation Example
//-------------------------------------------------
`timescale 1 ns / 100 ps

module count16 (count, count_tri, clk, rst_l, load_l, enable_l, cnt_in, oe_l);
output [3:0] count;
output [3:0] count_tri;
input clk;
input rst_l;
input load_l;
input enable_l;
input [3:0] cnt_in;
input oe_l;

reg [3:0] count;

// tri-state buffers
assign count_tri = (!oe_l)? count : 4'bzzzz;
// synchronous 4 bit counter
always @ (posedge clk or negedge rst_l)
begin
if (!rst_l) begin
count <= #1 4'b0000;
end
else if (!load_l) begin
count <= #1 cnt_in;
end
else if (!enable_l) begin
count <= #1 count + 1;
end
end

endmodule //of count16

HDL 로 설계는 아주 쉽지요. 이런 카운터를 종래의 논리회로 설계법과 비교하면 이렇게 쉬울순 없습니다. 이미 알고있는 언어적 상식과 하드웨어 특성 그리고 기초적인 Verilog 요소를 동원하면 금방 이해할 수 있습니다.

module ~ endmodule

HDL에는 병렬구문과 순차구문이 있다는 것을 이해합니다.

assign .....;

always @() begin ~ end

병렬 구문을 소프트웨어로 모의(simulate)하는 방법을 설명합니다. 보통 소프트웨어 언어의 문장 실행은 evaluation 즉시 저장 실행 되지만 HDL의 병렬 구문은 evaluation 후 event 수집 검사(aggregate event)후 최종 적용(update) 된다는 것을 설명해 줍니다.

정작 적재 가능한 16-비트 카운터(Loadable Counter)의 행위를 묘사하는 것은 그리 어렵지 않습니다. 누구나 다아는 if 구문이죠.

if () begin ~ end

이어서 테스트 벤치를 만들어 보죠.

//-------------------------------------------------
// File: cnt16_tb.v
// Purpose: Verilog Simulation Example
// Test Bench
//--------------------------------------------------
`timescale 1 ns / 100 ps
module cnt16_tb ();
//----------------------------------------------
// inputs to the DUT are reg type
reg clk_50;
reg rst_l, load_l, enable_l;
reg [3:0] count_in;
reg oe_l;

//----------------------------------------------
// outputs from the DUT are wire type
wire [3:0] cnt_out;
wire [3:0] count_tri;

//----------------------------------------------
// instantiate the Device Under Test (DUT)
// using named instantiation
count16 U1
(
.count(cnt_out),
.count_tri(count_tri),
.clk(clk_50),
.rst_l(rst_l),
.load_l(load_l),
.cnt_in(count_in),
.enable_l(enable_l),
.oe_l(oe_l)
);

//----------------------------------------------
// create a 50Mhz clock
always
#10 clk_50 = ~clk_50; // every ten nanoseconds invert

//----------------------------------------------
// initial blocks are sequential and start at time 0
initial
begin
$dumpfile("counter16.vcd");
$dumpvars(0, cnt16_tb);
$display($time, " << Starting the Simulation >>");
clk_50 = 1'b0; // at time 0
rst_l = 0; // reset is active
enable_l = 1'b1; // disabled
load_l = 1'b1; // disabled
count_in = 4'h0; // initialize counter val.
oe_l = 4'b0; // enabled

#20 rst_l = 1'b1; // at time 20 release reset
$display($time, " << Coming out of reset >>");
@(negedge clk_50); // wait till the negedge of
// clk_50 then continue
load_count(4'hA); // call the load_count task
@(negedge clk_50);
$display($time, " << Turning ON the count enable >>");
enable_l = 1'b0; // turn ON enable
// let the simulation run,
// the counter should roll
wait (cnt_out == 4'b0001); // wait until the count
// equals 1 then continue
$display($time, " << count = %d - Turning OFF the count enable >>", cnt_out);
enable_l = 1'b1;
#40; // let the simulation run for 40ns
// the counter shouldn't count
$display($time, " << Turning OFF the OE >>");
oe_l = 1'b1;
// disable OE, the outputs of
// count_tri should go high Z.
#20;
$display($time, " << Simulation Complete >>");
$stop; // stop the simulation
end
//---------------------------------------------------------
// This initial block runs concurrently with the other
// blocks in the design and starts at time 0
initial
begin
// $monitor will print whenever a signal changes
// in the design
$monitor($time,
" clk_50=%b,rst_l=%b,enable_l=%b,load_l=%b,count_in=%h,cnt_out=%h,oe_l=%b, count_tri=%h",
clk_50, rst_l, enable_l, load_l, count_in, cnt_out, oe_l, count_tri);
end
//---------------------------------------------------------
// The load_count task loads the counter with the value passed
task load_count;
input [3:0] load_value;
begin
@(negedge clk_50);
$display($time, " << Loading the counter with %h >>", load_value);
load_l = 1'b0;
count_in = load_value;
@(negedge clk_50);
load_l = 1'b1;
end
endtask //of load_count

endmodule //of cnt16_tb

Verilog 언어 입문용으로는 조금 과한 듯도 합니다만, 이제껏 배워온 지식과 직감을 총동원하면 전혀 모를것도 아닙니다. 대략적인 설명을 해줬지만 다음주에 한번더 설명해야 겠습니다.