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

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

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

關(guān)于行為仿真的一點(diǎn)觀點(diǎn)

冬至子 ? 來(lái)源:FPGA LAB ? 作者:李銳博恩 ? 2023-06-21 11:22 ? 次閱讀

前言

提前給出一些觀點(diǎn):

  • 仿真是為了仿真,所以不要設(shè)置極限情況,例如在時(shí)鐘上升沿通過(guò)阻塞賦值給數(shù)據(jù),應(yīng)該避免這種情況;
  • 各種不同的仿真軟件對(duì)時(shí)鐘上升沿通過(guò)阻塞賦值給數(shù)據(jù)的理解不一致,例如modelsim和isim;
  • 可以使用非阻塞賦值設(shè)置數(shù)據(jù)值,避免在時(shí)鐘上升沿時(shí)刻使用阻塞賦值給數(shù)據(jù)。

本文最后會(huì)給出推薦的仿真觀點(diǎn)。

實(shí)踐分析

事實(shí)上,上面三點(diǎn)說(shuō)的是針對(duì)一種情況,我們舉一個(gè)簡(jiǎn)單的例子說(shuō)明。我們的設(shè)計(jì)文件,很簡(jiǎn)單,就是一個(gè)檢測(cè)上升沿的程序:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Engineer: Reborn Lee
// website : https://blog.csdn.net/Reborn_Lee
//////////////////////////////////////////////////////////////////////////////////


module delay(
    input wire in,
    input wire clk,
    input wire rst,
    output reg out_r3
    );
    
    reg in_reg;
    
    always@(posedge clk) begin
        if(rst) begin
            in_reg <= 0;
        end
        else begin
            in_reg <= in;
        end
    end
    
    wire mid_pos;
    
    assign mid_pos = ~in_reg & in;
    
    reg reg_pos;
    reg reg1_pos;
    reg reg2_pos;
    
    always@(posedge clk) begin
        if(rst) begin
            reg_pos <= 0;
            reg1_pos <= 0;
            reg2_pos <= 0;
            out_r3 <= 0;
        end
        else begin
            reg_pos <= mid_pos;
            reg1_pos <= reg_pos;
            reg2_pos <= reg1_pos;
            out_r3 <= reg2_pos;
        end
    end
    

endmodule

如下,我們的testbench為:

`timescale 1ns / 1ps
// Engineer: Reborn Lee
// website : https://blog.csdn.net/Reborn_Lee
module sim_delay;
    reg     clk;
    reg     rst;
    reg     in;
    wire    out_r3;
    
    initial begin
        clk =   0;
        forever begin
            #5 clk =   ~clk;
        end
    end
    
    initial begin
    rst =    1;
    in =    0;
    
    #20 
    rst = 0;
    
    #100
    @(posedge clk) begin
        in =    1;
    end
    
    #300
    in =   0;
    
    end
    
    delay delay_inst(
        .in(in),
        .clk(clk),
        .rst(rst),
        .out_r3(out_r3)
    
    );
    

endmodule

我們對(duì)輸入進(jìn)行賦值:

@(posedge clk) begin
        in =    1;
    end

可見(jiàn),使用的是阻塞賦值,且在時(shí)鐘上升沿賦值;

在這種情況下,我們使用vivado自帶的仿真工具仿真,得到結(jié)果如下:

圖片

isim仿真工具

可見(jiàn),得不到上升沿,這我們其實(shí)也能理解;由于是行為仿真,所以,一切都是理想的,不考慮延遲;我們使用阻塞賦值在時(shí)鐘上升沿時(shí)刻給輸入賦值,立即生效;固然,我們的時(shí)鐘在上升沿采樣的時(shí)候,得到in_reg和in是同邊沿的,這樣自然就得不到邊沿了,后面延遲多拍也自然無(wú)用。

這是vivado的仿真工具isim對(duì)這種情況的理解。

現(xiàn)在問(wèn)題來(lái)了,當(dāng)我們使用modelsim進(jìn)行仿真的時(shí)候,情況是這樣的:

圖片

modelsim仿真工具

它會(huì)對(duì)in延遲一整拍,也就是要給時(shí)鐘,最終也就能得到上升沿了。同樣的設(shè)計(jì),同樣的仿真文件,為何會(huì)出現(xiàn)這樣的差異呢?這里給出的解釋是仿真工具對(duì)這種情況的理解問(wèn)題:在實(shí)際情況中(考慮真實(shí)環(huán)境,存在延遲),這種輸入的邊沿出現(xiàn)在時(shí)鐘的有效沿,本身就是不合法的,因?yàn)檫@會(huì)導(dǎo)致時(shí)序通過(guò)不了,例如建立時(shí)間。對(duì)于這種情況,modelsim或者questasim的處理就比較直接,我不準(zhǔn)出現(xiàn)這種情況,如果你出現(xiàn)了,我們認(rèn)為此刻無(wú)效。其效果類似于非阻塞賦值:

@(posedge clk) begin
        in <=    1;
    end

這里使用了非阻塞賦值,那么在時(shí)鐘上升沿時(shí)刻,in的值就沒(méi)那么快生效,如此,無(wú)論在那個(gè)平臺(tái)仿真,仿真情況都一致了。

下面是這種情況下在任意平臺(tái)的仿真圖:

圖片

任意平臺(tái)

推薦的仿真設(shè)計(jì)

開(kāi)門見(jiàn)山,在時(shí)鐘有效沿時(shí)刻給數(shù)據(jù)是不符合實(shí)際的,是極端的做法,這在實(shí)際情況中不會(huì)出現(xiàn),即使出現(xiàn),綜合布線工具也會(huì)重新布線避免這種情況,否則就是時(shí)許違規(guī)。因此為了有意義的仿真且統(tǒng)一仿真平臺(tái),我們應(yīng)該在距離有效沿一定延遲給數(shù)據(jù),例如:

#100
    @(posedge clk) begin
        #1 in =    1;
    end

或者:

#100
    @(negedge clk) begin
       in =    1;
    end

總之,別在有效沿給數(shù)據(jù),以這種情況為例,給出仿真圖:

#100
    @(posedge clk) begin
        #1 in =    1;
    end

圖片

推薦的仿真方式

總結(jié)

從上面的分析可以看出,為了適應(yīng)不同的仿真平臺(tái)(并不是說(shuō)哪個(gè)仿真平臺(tái)錯(cuò)了) ,且本著仿真意義的實(shí)際情況,我們不應(yīng)該在極端的情況下進(jìn)行仿真,不僅沒(méi)有意義,而且讓人疑惑。推薦的做法是在下降沿或者距離時(shí)鐘的上升沿有一定的延遲給數(shù)據(jù),這才能避開(kāi)不同平臺(tái)的差異且有實(shí)際意義。

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

    關(guān)注

    9

    文章

    428

    瀏覽量

    26452
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1011

    瀏覽量

    83559
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    803

    瀏覽量

    66151
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Saber中如何更好地提高仿真的收斂性()

    仿真過(guò)程中,由于仿真模型的不連續(xù)性,或者模型沒(méi)有適當(dāng)?shù)乇碚?參數(shù)化,或者當(dāng)求解器無(wú)法求解控制模型行為的方程時(shí),可能就會(huì)出現(xiàn)仿真的收斂問(wèn)題。
    的頭像 發(fā)表于 12-05 14:43 ?1398次閱讀
    Saber中如何更好地提高<b class='flag-5'>仿真的</b>收斂性(<b class='flag-5'>一</b>)

    關(guān)于通信原理的一點(diǎn)總結(jié)

    關(guān)于通信原理的一點(diǎn)總結(jié)
    發(fā)表于 08-20 10:00

    關(guān)于protus仿真的一點(diǎn)不懂,求大神指點(diǎn)啊,新手膜拜了

    我用c編了個(gè)小程序試了下手,發(fā)現(xiàn)一點(diǎn)問(wèn)題:我的main()函數(shù)中沒(méi)有循環(huán),就幾個(gè)簡(jiǎn)單的賦值加上延時(shí)來(lái)逐個(gè)顯示幾個(gè)數(shù)碼管。按我的理解,到最后應(yīng)該只固定顯示到最后的個(gè)數(shù)碼管不動(dòng)了,程序結(jié)束??蔀?/div>
    發(fā)表于 11-22 21:37

    個(gè)顯示溫度的音樂(lè)時(shí)鐘(仿真+代碼),自己一點(diǎn)點(diǎn)敲的....

    個(gè)顯示溫度的音樂(lè)時(shí)鐘(仿真+代碼),自己一點(diǎn)點(diǎn)敲的....
    發(fā)表于 04-17 20:28

    仿真的些資料

    仿真的一點(diǎn)點(diǎn)資料,東西很多。。{:7:}
    發(fā)表于 10-16 10:07

    為什么multisim中加入大一點(diǎn)的芯片就無(wú)法仿真?幫幫忙吧,積分很少,實(shí)在抱歉。

    為什么multisim14.0仿真的時(shí)候好好的,加入大一點(diǎn)的芯片就發(fā)現(xiàn)仿真變得很慢,不會(huì)就提示仿真
    發(fā)表于 12-21 21:34

    一點(diǎn)接地,什么是一點(diǎn)接地,一點(diǎn)接地應(yīng)注意的問(wèn)題

    一點(diǎn)接地,什么是一點(diǎn)接地 一點(diǎn)接地的形式如下圖所示,圖中將各級(jí)內(nèi)部的接地元件,即本級(jí)電路的發(fā)射極,基極和集電極的所有接
    發(fā)表于 09-30 11:35 ?2.7w次閱讀
    <b class='flag-5'>一點(diǎn)</b>接地,什么是<b class='flag-5'>一點(diǎn)</b>接地,<b class='flag-5'>一點(diǎn)</b>接地應(yīng)注意的問(wèn)題

    關(guān)于SI設(shè)計(jì)與SI仿真的一點(diǎn)淺見(jiàn)

    看到有很多人執(zhí)著于信號(hào)完整性仿真,也有人提到軟件仿真與實(shí)際不相符的問(wèn)題,談?wù)勎易约旱?b class='flag-5'>一些看法。
    發(fā)表于 11-30 11:16 ?5206次閱讀

    流水線ADC的行為級(jí)仿真

    行為級(jí)仿真是提高流水線(Pipeline)ADC設(shè)計(jì)效率的重要手段。建立精確的行為級(jí)模型是進(jìn)行行為級(jí)仿真的關(guān)鍵。本文采用基于電路宏模型技術(shù)的
    發(fā)表于 04-05 15:37 ?21次下載
    流水線ADC的<b class='flag-5'>行為</b>級(jí)<b class='flag-5'>仿真</b>

    關(guān)于畫(huà)高頻PCB板的一點(diǎn)心得

    關(guān)于畫(huà)高頻PCB板的一點(diǎn)心得,感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 16:29 ?0次下載

    路燈藍(lán)光危害你造嗎?專家建議“冷一點(diǎn),暗一點(diǎn)

    美國(guó)醫(yī)學(xué)會(huì)(AMA)最近接受了項(xiàng)關(guān)于街道照明的正式政策聲明:冷一點(diǎn)、暗一點(diǎn)。其在聲明中稱,對(duì)于晚上戶外照明,尤其是街道照明,其色溫不應(yīng)超過(guò)3000開(kāi)爾文(K)。較高的色溫光照越白,同
    發(fā)表于 11-18 08:59 ?3280次閱讀

    Xilinx ISE是如何調(diào)用ModelSim進(jìn)行仿真的

    在我們用ModelSim仿真的時(shí)候經(jīng)常是修改一點(diǎn)一點(diǎn)修改代碼,這樣會(huì)造成個(gè)無(wú)奈的操作循環(huán):修改代碼--->編譯代碼--->仿真設(shè)置--->
    發(fā)表于 02-11 15:25 ?1.1w次閱讀
    Xilinx ISE是如何調(diào)用ModelSim進(jìn)行<b class='flag-5'>仿真的</b>

    關(guān)于連接量子比特的一點(diǎn):量子計(jì)算

    關(guān)于連接量子比特的一點(diǎn):量子計(jì)算
    的頭像 發(fā)表于 01-04 11:17 ?963次閱讀
    <b class='flag-5'>關(guān)于</b>連接量子比特的<b class='flag-5'>一點(diǎn)</b>:量子計(jì)算

    時(shí)序仿真與功能仿真的區(qū)別有哪些?

    種EDA仿真,它模擬個(gè)數(shù)字電路中時(shí)序的行為。時(shí)序行為通常包括數(shù)據(jù)信號(hào)傳輸?shù)臅r(shí)序,如周期時(shí)間或LATCH信號(hào)的上升沿下降沿。它通常應(yīng)用于驗(yàn)證設(shè)計(jì)延遲、時(shí)序、時(shí)序違規(guī)和時(shí)序沖突等問(wèn)題。
    的頭像 發(fā)表于 09-17 14:15 ?5475次閱讀

    包絡(luò)仿真的四個(gè)步驟過(guò)程

    最近探索仿真的時(shí)候,在DF下仿真射頻系統(tǒng)時(shí),需要用到包絡(luò)仿真(envelope simulation),所以就扒拉著看了一點(diǎn)ADS里面關(guān)于
    的頭像 發(fā)表于 11-08 14:23 ?962次閱讀
    包絡(luò)<b class='flag-5'>仿真的</b>四個(gè)步驟過(guò)程