2008年12月31日 星期三

SystemC Modules and Processes(2)

階層架構(Hierarchy)
一個EXOR閘是由4個NAND閘(instance)組成。要達成這個目的,是在EXOR閘的建構式裏去連結實體化的NAND閘。
底下列出EXOR閘的範例程式:

#include "systemc.h"
#include "nand2.h"
SC_MODULE(exor2)
{
sc_in<bool> A, B;
sc_out<bool> F;

nand2 n1, n2, n3, n4;

sc_signal<bool> S1, S2, S3;

SC_CTOR(exor2) : n1("N1"), n2("N2"), n3("N3"), n4("N4")
{
n1.A(A);
n1.B(B);
n1.F(S1);

n2.A(A);
n2.B(S1);
n2.F(S2);

n3.A(S1);
n3.B(B);
n3.F(S3);

n4.A(S2);
n4.B(S3);
n4.F(F);
}
};

程式說明:
這個程式看起來跟NAND閘的程式很像,但注意它有去include nand2.h的檔案,這是為了去使用NAND閘模組所必需的。

這個exor2模組被建立起來,並宣告這個模組的ports。請再注意一下,設計上是可以重複使用A,B及F的名字,因為它跟nand的層級是不同的。

在電路圖中你可以看到有許多的線用以連結每個NAND閘。而在SystemC裏線的表現方式則是用sc_signal S1,S2及S3。
sc_signal是一個類別(class),它包含了樣版參數(template parameter)用以定義資料的型態,在這個例子中是使用bool的資料型態。
sc_signal是一個SystemC內建的通道(primitive channel)類別,內建的通道當然在SystemC class library裏。它的行為就如同VHDL裏的signal。

EXOR閘的建構式會比NAND閘再複雜一點,它必需實體化4個nand2來用。在port的定義之後,緊接著宣告實體化4個nand2:n1,n2,n3,n4。
每個實體化的nand2都必需要有個名字,所以我們在exor2建構式初使化時傳了4個"N1","N2","N3","N4"的名字,分別給n1,n2,n3,n4這4個nand2。

最後,將所有的ports所需要的連接線接起來。這樣子就完成了這個建構式了。

測試程式(Test bench)
要測試這個設計,當然就需要測試訊號的產生程式。這就必需要再寫另一個module,跟前面寫的module很類似。
但比較不同的是,在這裏我們是使用執行緒(thread)SC_THREAD,這個行程會在需要時進入休眠狀態。
底下列出這個Test bench的範例程式stim.h


#include "systemc.h"
SC_MODULE(stim)
{
sc_out<bool> A, B;
sc_in<bool> Clk;

void StimGen()
{
A.write(false);
B.write(false);
wait();
A.write(false);
B.write(true);
wait();
A.write(true);
B.write(false);
wait();
A.write(true);
B.write(true);
wait();
sc_stop();
}
SC_CTOR(stim)
{
SC_THREAD(StimGen);
sensitive << Clk.pos();
}
};

程式說明:
這裏要注意的是最後它們呼叫sc_stop(),這個函式會讓整個模擬結束。

有了訊號產生程式後,我們還需要一個監控程式,用來監控我們想看到的訊號改變情況,這個程式相當簡單,我們先忽略這個部份,在這個範例裏監控程式檔名是mon.h

底下列出top level的程式碼,它是寫在main.cpp裏,當然main.cpp必需include之前所寫的那些子模組(submodules)

#include "systemc.h"
#include "stim.h"
#include "exor2.h"
#include "mon.h"

int sc_main(int argc, char* argv[])
{
sc_signal<bool> ASig, BSig, FSig;
sc_clock TestClk("TestClock", 10, SC_NS,0.5);

stim Stim1("Stimulus");
Stim1.A(ASig);
Stim1.B(BSig);
Stim1.Clk(TestClk);

exor2 DUT("exor2");
DUT.A(ASig);
DUT.B(BSig);
DUT.F(FSig);

mon Monitor1("Monitor");
Monitor1.A(ASig);
Monitor1.B(BSig);
Monitor1.F(FSig);
Monitor1.Clk(TestClk);

sc_start(); // run forever

return 0;

}

程式說明:
在top-level裏 signal被宣告成線(wire)來使用,時脈的產生則是用sc_clock;然後把所需要的模組都實體化必加以連結起來。

都做完後,必需呼叫sc_start()來啟動模擬,模擬會一直持續執行,一直到有人呼叫了sc_stop()後結束模擬。

底下列出輸出結果的範例:

       Time A B F
0 s 0 0 1
10 ns 0 0 0
20 ns 0 1 1
30 ns 1 0 1
40 ns 1 1 0

如果你有注意看輸出結果,你應該會發生很詭異的事情,在第一行time 0s時,當時的A,B輸入為0,而F的輸出結為為1,這不應該是EXOR閘的正常輸出結果。
但在10ns之後,所有的結果都是對的了。在time 0s時到底發生了什麼事情了呢?

模擬(Simulation)
在SystemC library裏包含了一個模擬核心(simulation kernel)。它決定了那個行程(software threads)要被執行。
在time 0s時,所有的SC_METHOD及SC_THREAD將會隨機的被叫起來執行,一直到它們全都進入休眠(suppend)結束一個cycle。
SC_CTHREAD則是會在時脈一發生時就被執行。

上面的情況是由於組合電路的情況造成的

  1. sc_clock在時間time 0s會發生的上升緣(rising edge ),因此所有的monitor及stimulus行程在此時都會執行(在這種情況下,並不知道誰會先被執行)

  2. 在C++裏的變數並不見得都會被付與初使值(除非它們被宣告為靜態變數static),因此才會造成F在time 0s時會出現1的情況

  3. do_nand2 SC_METHOD在time 0s執行,而排程器也會去對F做更新,但是F是一個signal,它的內容並不能馬上被更新,因此當monitor在處理時,F的內容還會為1
在這個範例裏,改善的方式,可以去修改sc_clock讓它產生在第1個clock產生後延遲,如下:

sc_clock TestClk("TestClock", 10, SC_NS,0.5, 1, SC_NS);

加入的1, SC_NS兩個參數,定義了在第一個時脈發生後延遲1 ns,這會讓F的內容得以更新。
底下列出修改過後的執行結果:

       Time A B F
1 ns 0 0 0
11 ns 0 0 0
21 ns 0 1 1
31 ns 1 0 1
41 ns 1 1 0

現在你可以看到F的輸出結果都是正確的了。

結論
結束這篇快速瀏覽modules及process,你已經看到了SystemC模擬核心及內建的sc_signal通道的重要性。
你也看到了一些基本實體化低階模組的範例,它包含了一個top-level模組,以及sc_main是如何被使用的。

資料來源:
http://www.doulos.com/knowhow/systemc/tutorial/modules_and_processes/

SystemC Modules and Processes(1)

這個章節包含了一個完整的基本設計用以展示如何在SystemC裏使用modules及processes.
為了淺顯易懂,它是屬於非常低階的設計,這種設計方式並不是一個你在做系統層級設計時所希望的。
主要的展示重點:
  1. 建立階層架構

  2. 使用內建的sc_signal通道

  3. (特殊)ports

  4. Processes(SC_METHOD, SC_THREAD, SC_CTHREAD)

  5. 一個簡單的測試程式
SystemC的背景
為什麼要看Modules及Processes呢?這是因為System的主要目的是想要解決軟體及硬體的同時設計,並且希望能對大型的系統建立模型。
Process是程式裏的最小單位,系統裏的每個Process皆是平行運作的。機乎所有的高階系統層級設計(high-level system level design:SLD)工具都是以網絡行程(network of processes)的基礎模型(underlying model)來開發設計的。
SystemC提供了Processes(行程)來支援建構網絡裏的每個獨立(同時/平行)的程式碼區塊(pieces of code)。

SLD常會遇到大型的設計需求。為了滿足這個目的,它通常都是使用階層式(Hierarchy)的架構來設計。階層式架構在SystemC裏會以module來實現它,一個類別(class)和其它的modules的連接方式必需使用ports。
Modules允許被分割進行設計開發。Modules可能包含其它的processes以及實體化(instances)其它的modules。

一個設計範例
這個範例是以4個NAND閘組成1個EXOR閘。再次說明,這個範例並不是一個典型設計的風格,但是它可以很容易的讓大家了解SystemC。
範例電路圖如下:

第一步當然就是去建構NAND閘的模型囉。NAND閘是一種組合電路,它的輸出完全取決於輸入端,它完全沒有記憶功能,也不需要時脈。
所以這個模型(model)可以使用SystemC裏最簡單的process SC_METHOD 來設計。

SC_METHOD是一個簡單的C++函式,因此SystemC class library將它拿來展現processes的行為。
比較特別的:
SystemC class library包含了一個模擬核心(simulation kernel) - 處理每個模型的時間推移,以及當有輸入改變時呼叫函式去處理相應的輸出。
SC_METHOD需要定義function給它及觸發function的輸入值條件。(The function must be declared as an SC_METHOD and made sensitive to its inputs.)

底下是NAND閘的範例程式(nand.h)
#include "systemc.h"

SC_MODULE(nand2) // declare nand2 sc_module

{
sc_in<bool> A, B; // input signal ports
sc_out<bool> F; // output signal ports

void do_nand2() // a C++ function
{
F.write( !(A.read() && B.read()) );
}

SC_CTOR(nand2) // constructor for nand2
{
SC_METHOD(do_nand2); // register do_nand2 with kernel
sensitive << A << B; // sensitivity list
}
};
程式說明:

階層架構在SystemC裏是使用class sc_module來實現。sc_module 可能會被直接拿來使用,也可能會被使用巨集SC_MODULE指令所隱藏起來。
上面的範例裏就是使用SC_MODULE來建立一個sc_module名字叫nand2的類別物件。

接下來宣告輸入及輸出埠。一般來說,一個埠的宣告都是使用類別sc_port。
再進一步的例子,input ports還會需要使用sc_signal來宣告型態。如:
sc_port<sc_signal_in_if<bool>,1> A,B;
所以就如同你看到的,會有很多很多的形態耶。所以為了方便,也可以使用特別的ports.
sc_in就是一個特殊的埠用以快速的使用sc_signal。

ports可以是C++或SystemC的任何一種形態,範例裏是使用C++內建的bool形態。

再接下來介紹,input及output ports都包含了read()/write()的方法(methods),使用它們來讀/寫埠的資料。
A和B都是被拿來讀資料的,do_nand2()是拿來計算的函式,而計算結果將透過write()寫入到F裏。

注意一下你也可以不使用read()/write()來讀/寫資料,用=來進行操做,如:
F = !(A && B);
但是使用read()/write()是比較好的作法,它比較容易讓C++的編譯程式進行分析。

在看完do_nand2()後,接著是建構式sc_module,它實體化了nand2這個物件。SystemC提供了簡單的方法來完成這件事,那就是SC_CTOR。
這個建構式處理的事情如下:
  1. 建立階層(不過在這個範例中沒有)

  2. 在simulation kernel裏註冊我們這個新的process

  3. 宣告這個的觸發條件清單列表


它也可能在建構式裏做一些初使化的的行為 - 比如說:類別資料成員就可以在建構式裏進行初使化。

所以在上面的範例程式裏,建構式宣告了do_nand2是一個SC_METHOD,並且告訴kernel當port A/B值發生改變時去執行do_nand2()。

資料來源:
http://www.doulos.com/knowhow/systemc/tutorial/modules_and_processes/

2008年12月26日 星期五

神奇的隱形

隱形斗篷 - 日本大學的實驗





傳說中的「隱形斗篷」將於IEDM亮相

如果你是「星艦迷航記(Star Trek;或譯銀河飛龍)」系列影集的忠實粉絲就應該記得,總是扮演反派角色的羅慕倫人(Romulans),最會用隱形裝置來藏太空船,令人防不勝防。

現在這種隱形裝置有可能成為現實,在近日於美國舉行的國際電子元件會議(IEDM)上,美國波士頓大學的研究人員將發表一種軟性、可實現隱形斗篷(防護罩)概念的「超常介質(metamaterial;或譯超物質)」技術。

據了解,波士頓大學將介紹一種安裝在聚亞醯胺( polyimide)基板上的軟性圓柱狀超常介質材料,以兆赫(terahertz,THz)速度運作。超常介質是一種「次波長(sub-wavelength)」複合材料,可用來合成金屬或是支援電介質(dielectrics)。

上述的超常介質結構是由200mm厚的金與10mm鈦黏著層,在聚亞醯胺基板上所組成;該基板是用液態聚亞醯胺透過旋轉塗佈(spin-coated)法,在塗佈了400nm厚的噴濺氮化矽薄膜的2吋矽晶圓上所形成。

該基板包含了純電子共振器與標準開環共振器(Split Ring Resonator);軟性共振材料依次安裝在聚亞醯胺基板上,以製作大量的多層、非平面電磁複合物。這種複合材料就可用來做為於0.5 THz頻率下能隱形的遮罩。

(參考原文:Group demos metamaterials for invisible cloak,by Mark LaPedus)

資料來源:
http://www.eettaiwan.com/ART_8800556757_480102_NT_a5d84932.HTM

解讀「終極SoC」密碼──MEMS完全手冊

從實驗室中的基礎研究,到近來開始滲入消費性電子產品,微機電系統(MEMS)的廣泛應用已成為產業發展的一個重要趨勢,值得密切關注。為了讓讀者們更容易掌握MEMS領域發展趨勢,《電子工程專輯》收集了近來針對MEMS的相關報導與技術文章,製作了一份『解讀「終極SoC」密碼──MEMS完全手冊』電子書,歡迎有興趣的讀者踴躍下載或傳閱。
E Book Mems
View SlideShare document or Upload your own.

資料來源:
http://www.eettaiwan.com/ART_8800463781_480502_NT_973e8fb3.HTM

Soc ESL簡單介紹

這篇文章是希望能幫助大家了解現代嵌入式系統和SoC設計工具的概念及其使用方法,以期在SoC設計中實現電子系統級模擬及設計空間探索,為嵌入式的軟體和硬體作出最新最複雜的整合性現代設計。
內容包括
(1)什麼是ESL
(2)ESL和嵌入式系統SoC設計
(3)抽象模型建立與系統設計方法
(4)嵌入式系統軟硬體電子化設計工具鏈和流程
(5)工具鏈介紹以AndeSight為例
(6)ESL tool--Andes AndESLive 介紹
(7)展望
作者: 謝達人
20080701 Oe Andes Ta 02
View SlideShare document or Upload your own.


資料來源:
http://www.eettaiwan.com/ART_8800531764_676964_TA_efafd008.HTM

2008年12月25日 星期四

EFI - SEC(Security)階段

EFI - SEC(Security)階段

SEC階段是EFI的第一個執行階段,當電腦Power-On時就會進入此階段,原則上EFI只有這個部份會使用組合語言搭配C語言撰寫,此階段的重點目的是把CPU的SP(Stack Pointer)指到CPU內部的Cache中。

SEC階段主要功能
  1. 掌控平台的restart事件

  2. Real Mode to Protected Mode

  3. 使用CPU Cache當做記憶體(Creates a temporary memory store)

  4. 因為在此階段時,北橋裏的Memory Controller還沒有初使化,尚無法使用系統記憶體,但C語言執行時需要Stack Area,因此暫時先拿Cache來做堆疊區。
  5. 進入下個PEI階段(Passes handoff information to the PEI)


更詳細的參考資料可以看Intel® Platform Innovation Framework for EFI Architecture Specification - Draft for Review

2008年12月4日 星期四

Moblin Project:Fast Boot

http://moblin.org/projects/fast-boot

這是MID的官網,介紹了MID如何讓系統在5秒內開完機及Demo唷!

5秒開完的簡報檔
http://moblin.org/sites/all/files/u123/plumbers_fastboot.pdf

Demo影片
http://www.youtube.com/watch?v=s7NxCM8ryF8

真是超快的!

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...