RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從仿真器的角度理解Verilog語言2

jf_78858299 ? 來源:IC大家談 ? 作者:王君實(shí) ? 2023-05-25 15:10 ? 次閱讀

延遲行為

Verilog語言的延遲語句雖然不能綜合,但是在仿真過程中應(yīng)用得很多。延遲語句可以用在testbench中構(gòu)建時(shí)鐘信號(hào)和激勵(lì),也可以用在Verilog模塊中模擬實(shí)際電路的延遲。延遲語句可以出現(xiàn)在兩條賦值語句之間,也可以出現(xiàn)一條賦值語句中間。

#3 a = b; //延遲語句在賦值語句之間
a = #3 b; //延遲語句在賦值語句內(nèi)部

在賦值語句之間的延遲語句可以延遲語句的執(zhí)行。對(duì)于仿真器來說,處于賦值語句之間的延遲語句有兩個(gè)作用。首先,延遲語句會(huì)暫停當(dāng)前always塊的執(zhí)行,結(jié)束當(dāng)前的仿真階段,更新之前沒有完成的賦值,完成當(dāng)前事件的響應(yīng)并將控制前交還給事件隊(duì)列。然后,延遲語句會(huì)在事件隊(duì)列中添加一個(gè)新的事件。這個(gè)事件表示在延遲語句指定的時(shí)刻開始執(zhí)行這函數(shù)剩下的部分。例如

always @(a, b, c) begin : add_mux4
    t <= a + b;
    #1 d = t * c;
end

上述代碼轉(zhuǎn)化后的事件響應(yīng)函數(shù)為

function add_mux4_1 :
    t_update = a + b;
    t = t_update;
    addEvent( curr_time + 1, add_mux4_2 );




function add_mux4_2 :
    d = t * c;

Verilog文件中的1個(gè)過程塊被轉(zhuǎn)換為兩個(gè)函數(shù)。第一個(gè)函數(shù)add_mux4_1對(duì)應(yīng)于延遲語句之前的部分,第二個(gè)函數(shù)add_mux4_2對(duì)應(yīng)于延遲語句之后的部分。

add_event是本文定義的一個(gè)原語,表示向事件隊(duì)列中添加一個(gè)事件。第一個(gè)參數(shù)表示事件響應(yīng)的時(shí)間,第二個(gè)參數(shù)表示響應(yīng)事件需要調(diào)用的事件響應(yīng)函數(shù)。從第三個(gè)參數(shù)開始,之后的參數(shù)會(huì)作為事件響應(yīng)函數(shù)的參數(shù),傳遞給事件響應(yīng)函數(shù)。

add_event( curr_time + 1, add_mux4_2 )表示在當(dāng)前時(shí)間(curr_time)后1個(gè)時(shí)間單位的時(shí)候響應(yīng)這個(gè)事件。事件需要調(diào)用add_mux4_2函數(shù)。響應(yīng)函數(shù)不需要額外的參數(shù)。在調(diào)用add_mux4_2時(shí),信號(hào)t已經(jīng)完成更新。

在賦值語句中間的延遲語句將評(píng)估和更新階段分割到兩個(gè)時(shí)刻進(jìn)行。評(píng)估過程仍然在語句執(zhí)行的時(shí)候進(jìn)行,但是更新過程延后到延遲語句指定的時(shí)刻進(jìn)行。延遲語句是否阻塞過程塊的執(zhí)行,取決于賦值語句本身。如果是阻塞賦值語句,賦值語句中間的延遲語句會(huì)阻塞過程塊的執(zhí)行;如果是非阻塞賦值,延遲語句不會(huì)阻塞過程塊的執(zhí)行。例如

always @(a, b, c) begin : add_mux5
    t <= #1 a + b;
    d = #2 t * c;
end

上述代碼轉(zhuǎn)化后的事件響應(yīng)函數(shù)為

function add_mux5_1:
    t_update = a + b; // 1
    d_update = t * c; // 2
    addEvent( curr_time + 1, update_t, t_update );
    addEvent( curr_time + 2, add_mux5_2, d_update );




function update_t( t_update ) :
    t = t_update; // 3




function add_mux5_2( d_update ) :
    d = d_update; // 4

如果沒有延遲語句,事件響應(yīng)函數(shù)的執(zhí)行順序應(yīng)該是 1->2->4->3。由于第一個(gè)語句中的延遲語句,語句3需要在當(dāng)前時(shí)刻之后1個(gè)時(shí)間單位時(shí)執(zhí)行,即update_t。t_update作為事件響應(yīng)函數(shù)的參數(shù),在update_t中更新給信號(hào)t。由于第二個(gè)語句中的延遲語句,過程塊被打斷為兩個(gè)部分,第二個(gè)函數(shù)需要在當(dāng)前時(shí)刻之后2個(gè)時(shí)間單位時(shí)執(zhí)行,即add_mux5_2。add_mux5_2需要使用d_update作為參數(shù)。

理解到這一層,就可以處理更加復(fù)雜的波形了。例如下面這一段代碼。

module test;
    reg x,y,z;
    assign #25 a = 1;
    always begin
        #20;
        x = #10 a;
        #3 y = a;
        #3 z = a;
        #7;
    end
endmodule

經(jīng)過仿真器的轉(zhuǎn)換,上面的Verilog語句會(huì)形成如下的事件響應(yīng)函數(shù)。

function assign1 :
    a = 1;




function always1_1 :
    addEvent( curr_time + 20, always1_2 );




function always1_2 :
    x_update = a;
    addEvent( curr_time + 10, always1_3, x_update );




function always1_3( x_update ) :
    x = x_update;
    addEvent( curr_time + 3, always1_4 );




function always1_4 :
    y = a;
    addEvent( curr_time + 3, always1_5 );




function always1_5 :
    z = a;
    addEvent( curr_time + 7, always1_6 );




function always1_6 :
    addEvent( curr_time + delta, always1_1 );

在仿真開始時(shí)候,首先向事件隊(duì)列中添加兩個(gè)事件,分別是在0+25時(shí)刻調(diào)用assign1,以及在0+0時(shí)刻調(diào)用always1_1。事件響應(yīng)過程如圖4所示。always過程塊被延遲語句分割成了6個(gè)響應(yīng)函數(shù)。每個(gè)部分都向事件隊(duì)列添加能夠觸發(fā)下一個(gè)響應(yīng)函數(shù)的事件。信號(hào)x的第1次評(píng)估發(fā)生在20時(shí)刻,而第1次更新發(fā)生在30時(shí)刻,所以信號(hào)x的第一次賦值仍為X。直到第2次評(píng)估時(shí)(63時(shí)刻)才能獲得有效的信號(hào)1,并且在73時(shí)刻更新給信號(hào)x。

圖片

圖4 示例過程的事件隊(duì)列響應(yīng)過程和波形圖

需要說明的是,雖然本文提供了一種思路能夠比較輕松地理解行為級(jí)描述的執(zhí)行過程,但是仍然不建議大家在過程塊中混用阻塞賦值和非阻塞賦值?;煊觅x值語句是危險(xiǎn)的。

Assign賦值

前面介紹的側(cè)重于過程塊。對(duì)于Assign賦值語句,原理其實(shí)是也一樣的。例如

assign a = #5 b & c;

這條assign語句同樣可以看做一個(gè)事件響應(yīng)函數(shù)。這個(gè)函數(shù)綁定的事件是信號(hào)b或信號(hào)c發(fā)生變化。延遲語句的效果也是一樣的。延遲語句將評(píng)估和更新過程分開。當(dāng)信號(hào)b或信號(hào)c發(fā)生變化時(shí)進(jìn)行評(píng)估,并在事件隊(duì)列中添加一個(gè)新的更新事件。5個(gè)時(shí)間單位之后,響應(yīng)更新事件,將評(píng)估的值更新給信號(hào)a。

轉(zhuǎn)換后的事件響應(yīng)函數(shù)如下。

function assign1:
    a_update = b & c;
    addEvent( curr_time + 5, update_a, a_update );




function update_a( a_update ) :
    a = a_update;

調(diào)試

Verilog仿真器普遍提供了Verilog代碼的調(diào)試能力,比如斷點(diǎn)和單步運(yùn)行。在VCS、ModelSim、Vivado和Quartus中都能找到調(diào)試模式。斷點(diǎn)和單步運(yùn)行是典型的軟件調(diào)試手段,是軟件工程師的看家本領(lǐng)。但是對(duì)于硬件來說,斷點(diǎn)和單步運(yùn)行卻是不可理解的,因?yàn)橛布遣⑿械摹H绻麑帱c(diǎn)理解為硬件電路在某一個(gè)時(shí)刻的狀態(tài),那么此時(shí)應(yīng)該有多條語句被同時(shí)中斷。硬件電路不會(huì)像軟件一樣在某個(gè)函數(shù)中中斷并且單步執(zhí)行,而且其他過程塊或語句毫無影響。

前面已經(jīng)介紹過,Verilog并不是可執(zhí)行語言。真正的可執(zhí)行仿真程序是由仿真器提供的仿真框架源代碼和由Verilog語言轉(zhuǎn)換而來的仿真程序源代碼構(gòu)成的。實(shí)際上,Verilog語言調(diào)試的斷點(diǎn)并不是添加給硬件的或者Verilog源文件的,而是添加到可執(zhí)行仿真程序中對(duì)應(yīng)的事件響應(yīng)函數(shù)的。單步調(diào)試的對(duì)象也是可執(zhí)行仿真程序中的事件響應(yīng)函數(shù)。所以,Verilog代碼可以引入斷點(diǎn)和單步調(diào)試。

在進(jìn)一步解釋Verilog調(diào)試器的機(jī)制之前,必須先解釋一下軟件調(diào)試器是如何調(diào)試程序的。為了使得可執(zhí)行文件可調(diào)試,編譯器會(huì)在可執(zhí)行程序中添加調(diào)試信息。以C語言為例,編譯器會(huì)在可執(zhí)行文件中添加調(diào)試信息(如圖5所示)。添加的位置是在對(duì)應(yīng)于C語言語句的匯編代碼段起始的位置。在進(jìn)行軟件調(diào)試的時(shí)候,軟件調(diào)試器會(huì)在有調(diào)試信息的地方暫停(比如0x4005a5)。進(jìn)行單步調(diào)試的時(shí)候,每一步也都是停在C語言語句開始的地方(比如0x4005bf)。

圖片

圖5 可調(diào)試程序中添加的調(diào)試信息(利用objdump命令得到)

Verilog調(diào)試器的作用就是將可執(zhí)行仿真程序和Verilog語言對(duì)應(yīng)起來。一種思路是將編譯器插入的調(diào)試信息與Verilog語言對(duì)應(yīng)起來。編譯器插入的調(diào)試信息是對(duì)應(yīng)于可執(zhí)行的仿真源文件,而這些源文件是由仿真器生成的。所以Verilog調(diào)試器可以獲得調(diào)試信息與Verilog語句的對(duì)應(yīng)關(guān)系。另一種思路是通過編譯器直接給可執(zhí)行仿真程序添加與Verilog語言對(duì)應(yīng)的調(diào)試信息。這樣Verilog調(diào)試器從可執(zhí)行程序就可以獲得必要的信息,而不需要額外的消息來源。

Verilog調(diào)試器只能對(duì)可以與Verilog語言對(duì)應(yīng)的代碼部分添加斷點(diǎn),也就是只能對(duì)事件響應(yīng)函數(shù)添加斷點(diǎn)。Verilog調(diào)試器不能調(diào)試由仿真器提供的仿真框架源代碼。當(dāng)單步調(diào)試遇到always塊結(jié)束或者assign語句之后,調(diào)試器不會(huì)進(jìn)入仿真引擎,而是直接跳轉(zhuǎn)到下一個(gè)事件響應(yīng)函數(shù)。此外,Verilog調(diào)試器還限制了斷點(diǎn)和單步調(diào)試的粒度只能以Verilog語句為單位,而不能進(jìn)一步縮小粒度到可執(zhí)行仿真程序的語句甚至匯編層面。

圖片

圖6 Verilog程序加斷點(diǎn)的過程

以圖6中的Verilog程序?yàn)槔?jīng)過Verilog仿真器得到右邊所示的仿真源文件,再經(jīng)過編譯得到可執(zhí)行程序。在左邊Verilog程序中的一行設(shè)置了一個(gè)斷點(diǎn)(圖5中左邊第7行),這個(gè)斷點(diǎn)實(shí)際上是設(shè)置在右邊的可執(zhí)行程序的事件響應(yīng)函數(shù)always1_4中的(圖5中右邊第2行)。每當(dāng)仿真程序運(yùn)行到always1_4時(shí)就觸發(fā)中斷,暫停程序執(zhí)行。通過仿真器添加的調(diào)試提示信息,調(diào)試器能夠知道中斷的位置是Verilog語言的第7行,從而在圖形界面上顯示。

從斷點(diǎn)的位置開始單步調(diào)試。從可執(zhí)行仿真程序的層面來說應(yīng)該在第3行暫停,并且呈現(xiàn)第3行執(zhí)行后狀態(tài)。但是,Verilog調(diào)試器會(huì)過濾仿真框架的程序,也就是過濾掉無法對(duì)應(yīng)到Verilog程序的語句。所以,可執(zhí)行程序不會(huì)在第3行之后暫停,而是繼續(xù)執(zhí)行。第3行結(jié)束后,程序從事件響應(yīng)函數(shù)返回,進(jìn)入仿真框架的部分。仿真器框架的代碼也會(huì)被調(diào)試器忽略,直到仿真程序進(jìn)入下一個(gè)事件響應(yīng)函數(shù)。最終,程序進(jìn)入always1_5。調(diào)試器會(huì)在第6行暫停,并且將中斷的位置對(duì)應(yīng)到Verilog軟件的第8行。程序運(yùn)行的標(biāo)志會(huì)顯示在圖6中第8行的位置。

以上的過程對(duì)于用戶來說都是不可見的。從用戶的角度看來,只能看到程序指針從第7行跳到第8行,并且第7行語句的效果在波形圖上展現(xiàn)了出來。這就是Verilog語言調(diào)試背后隱藏的過程,其核心仍然是軟件調(diào)試。

結(jié)語

本文的初衷是提供通過仿真器理解Verilog語言的思路。文中關(guān)于Verilog仿真器的描述采用了最簡(jiǎn)單、最直接的思路,當(dāng)然也是效率最低的。實(shí)際的仿真器會(huì)通過各種軟件技巧進(jìn)行優(yōu)化,提高仿真效率。文中使用的一些概念借鑒自SystemC,比如仿真階段和“評(píng)估-更新”機(jī)制。電路仿真器的設(shè)計(jì)思路和概念都是類似的或者相通的,可以觸類旁通。

如果有讀者想進(jìn)一步理解Verilog仿真器,不妨看一下開源Verilog仿真器iVerilog的源碼。此外,SystemC也是一套很好的硬件電路仿真框架,建議學(xué)習(xí)SystemC標(biāo)準(zhǔn)。IEEE的SystemC標(biāo)準(zhǔn)會(huì)闡述SystemC需要的仿真引擎以及編程規(guī)范。

作者才疏學(xué)淺,掛一漏萬,請(qǐng)大家多批評(píng)指正。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1017

    瀏覽量

    83721
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4921

    瀏覽量

    87396
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110074
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Verilog語言中阻塞和非阻塞賦值的不同

    賦值何時(shí)使用阻塞賦值才能設(shè)計(jì)出符合要求的電路。 他們也不完全明白在電路結(jié)構(gòu)的設(shè)計(jì)中,即可綜合風(fēng)格的Verilog模塊的設(shè)計(jì)中,究竟為什么還要用非阻塞賦值,以及符合IEEE 標(biāo)準(zhǔn)的Verilog 仿真器究竟如何來處理非阻塞賦值的
    的頭像 發(fā)表于 08-17 16:18 ?6374次閱讀

    明德?lián)P至簡(jiǎn)設(shè)計(jì)法--verilog的綜合仿真器

    是不關(guān)心的。常用的仿真器是MODELSIM和VCS等。 由此可見,verilog的代碼不僅可以描述電路,還可以用于測(cè)試。事實(shí)上,Verilog定義的語法非常之多,但絕大部分都是為了仿真
    發(fā)表于 10-08 15:19

    Aldec 多語言仿真器鎖定主流用戶

    Aldec 多語言仿真器鎖定主流用戶   Aldec 公司日前推出了一款新型 Active-HDL 多語言仿真器,定價(jià)為 1,995 美元,據(jù)稱
    發(fā)表于 02-08 10:09 ?1332次閱讀
    Aldec 多<b class='flag-5'>語言</b><b class='flag-5'>仿真器</b>鎖定主流用戶

    模擬/混合信號(hào)仿真器

    Harmony單核模擬/混合信號(hào)仿真器實(shí)時(shí)地動(dòng)態(tài)連接SmartSpice 電路仿真器和SILOS-XVerilog仿真器的性能。Harmony集精度、性能、產(chǎn)量和靈活性于一身,仿真
    發(fā)表于 03-31 13:09 ?74次下載

    VERILOG仿真器

    SILOS是一個(gè)遵循IEEE-1364-2001標(biāo)準(zhǔn)的Verilog仿真器,它簡(jiǎn)單易用,為眾多IC設(shè)計(jì)師所推崇。自1986年作為工業(yè)標(biāo)準(zhǔn)以來,它強(qiáng)大的交互式調(diào)試功能為FPGA、PLD、ASIC和定制數(shù)字設(shè)計(jì)提供了現(xiàn)今最具
    發(fā)表于 04-05 23:03 ?150次下載

    快速理解Verilog語言

    Verilog HDL簡(jiǎn)稱Verilog,它是使用最廣泛的硬件描述語言。
    的頭像 發(fā)表于 03-22 17:29 ?5038次閱讀

    Verilog硬件描述語言參考手冊(cè)免費(fèi)下載

    Verilog標(biāo)準(zhǔn)前,由于Cadence公司的 Verilog-XL 仿真器廣泛使用,它所提供的Verilog LRM成了事實(shí)上的語言標(biāo)準(zhǔn)。
    發(fā)表于 02-05 16:24 ?73次下載
    <b class='flag-5'>Verilog</b>硬件描述<b class='flag-5'>語言</b>參考手冊(cè)免費(fèi)下載

    使用Vivado仿真器進(jìn)行混合語言仿真的一些要點(diǎn)

    Vivado 仿真器支持混合語言項(xiàng)目文件及混合語言仿真。這有助于您在 VHDL 設(shè)計(jì)中包含 Verilog 模塊,反過來也是一樣。 本文主要
    的頭像 發(fā)表于 10-28 16:24 ?3176次閱讀

    STM32-DAP仿真器的使用(1)

    目錄1 仿真器簡(jiǎn)介2 硬件連接3 仿真器配置4 下載程序1 仿真器簡(jiǎn)介 TIPS:JTAG包含SW2 硬件連接3
    發(fā)表于 11-18 09:36 ?71次下載
    STM32-DAP<b class='flag-5'>仿真器</b>的使用(1)

    如何通過仿真器理解Verilog語言的思路

    要想深入理解Verilog就必須正視Verilog語言同時(shí)具備硬件特性和軟件特性。
    的頭像 發(fā)表于 07-07 09:54 ?1474次閱讀

    仿真器角度對(duì)Verilog語言的語法規(guī)則進(jìn)行解讀

    綜合工具讀入源文件,通過綜合算法將設(shè)計(jì)轉(zhuǎn)化為網(wǎng)表,比如DC。能夠綜合的特性要求Verilog語言能夠描述信號(hào)的各種狀態(tài)(0,1,x,z)、信號(hào)和模塊的連接(例化)以及模塊的邏輯(賦值以及各種運(yùn)算符)。
    發(fā)表于 07-07 09:53 ?872次閱讀

    Vivado仿真器進(jìn)行混合語言仿真的一些要點(diǎn)

    本文主要介紹使用 Vivado 仿真器進(jìn)行混合語言仿真的一些要點(diǎn)。
    發(fā)表于 08-01 09:25 ?1326次閱讀

    verilog仿真工具編譯

    Icarus Verilog(以下簡(jiǎn)稱iverilog )號(hào)稱“全球第四大”數(shù)字芯片仿真器,也是一個(gè)完全開源的仿真器。
    的頭像 發(fā)表于 08-15 09:11 ?8388次閱讀

    解碼國產(chǎn)EDA數(shù)字仿真器系列之二 | 如何實(shí)現(xiàn)全面的SystemVerilog語法覆蓋?

    持SystemVerilog語言,是開發(fā)仿真器的一個(gè)重要任務(wù)。 ? SystemVerilog的發(fā)展歷程 ? 數(shù)字芯片的驗(yàn)證技術(shù)是隨著Verilog語法的演變而演變的。 最早,Verilog
    發(fā)表于 04-07 14:40 ?746次閱讀
    解碼國產(chǎn)EDA數(shù)字<b class='flag-5'>仿真器</b>系列之二 | 如何實(shí)現(xiàn)全面的SystemVerilog語法覆蓋?

    仿真器角度理解Verilog語言1

    只作為語法設(shè)定來介紹,忽略了Verilog語言的軟件特性和仿真特性。使得初學(xué)者無法理解Verilog語言
    的頭像 發(fā)表于 05-25 15:10 ?911次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>仿真器</b>的<b class='flag-5'>角度</b><b class='flag-5'>理解</b><b class='flag-5'>Verilog</b><b class='flag-5'>語言</b>1
    RM新时代网站-首页