精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于行為仿真的一點觀點

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

前言

提前給出一些觀點:

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

本文最后會給出推薦的仿真觀點。

實踐分析

事實上,上面三點說的是針對一種情況,我們舉一個簡單的例子說明。我們的設計文件,很簡單,就是一個檢測上升沿的程序:

`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

我們對輸入進行賦值:

@(posedge clk) begin
        in =    1;
    end

可見,使用的是阻塞賦值,且在時鐘上升沿賦值;

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

圖片

isim仿真工具

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

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

現在問題來了,當我們使用modelsim進行仿真的時候,情況是這樣的:

圖片

modelsim仿真工具

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

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

這里使用了非阻塞賦值,那么在時鐘上升沿時刻,in的值就沒那么快生效,如此,無論在那個平臺仿真,仿真情況都一致了。

下面是這種情況下在任意平臺的仿真圖:

圖片

任意平臺

推薦的仿真設計

開門見山,在時鐘有效沿時刻給數據是不符合實際的,是極端的做法,這在實際情況中不會出現,即使出現,綜合布線工具也會重新布線避免這種情況,否則就是時許違規。因此為了有意義的仿真且統一仿真平臺,我們應該在距離有效沿一定延遲給數據,例如:

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

或者:

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

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

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

圖片

推薦的仿真方式

總結

從上面的分析可以看出,為了適應不同的仿真平臺(并不是說哪個仿真平臺錯了) ,且本著仿真意義的實際情況,我們不應該在極端的情況下進行仿真,不僅沒有意義,而且讓人疑惑。推薦的做法是在下降沿或者距離時鐘的上升沿有一定的延遲給數據,這才能避開不同平臺的差異且有實際意義。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA設計
    +關注

    關注

    9

    文章

    428

    瀏覽量

    26489
  • 仿真器
    +關注

    關注

    14

    文章

    1016

    瀏覽量

    83646
  • Vivado
    +關注

    關注

    19

    文章

    808

    瀏覽量

    66343
收藏 人收藏

    評論

    相關推薦

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

    仿真過程中,由于仿真模型的不連續性,或者模型沒有適當地表征/參數化,或者當求解器無法求解控制模型行為的方程時,可能就會出現仿真的收斂問題。
    的頭像 發表于 12-05 14:43 ?1555次閱讀
    Saber中如何更好地提高<b class='flag-5'>仿真的</b>收斂性(<b class='flag-5'>一</b>)

    關于通信原理的一點總結

    關于通信原理的一點總結
    發表于 08-20 10:00

    關于protus仿真的一點不懂,求大神指點啊,新手膜拜了

    我用c編了個小程序試了下手,發現一點問題:我的main()函數中沒有循環,就幾個簡單的賦值加上延時來逐個顯示幾個數碼管。按我的理解,到最后應該只固定顯示到最后的個數碼管不動了,程序結束。可為
    發表于 11-22 21:37

    個顯示溫度的音樂時鐘(仿真+代碼),自己一點點敲的....

    個顯示溫度的音樂時鐘(仿真+代碼),自己一點點敲的....
    發表于 04-17 20:28

    仿真的些資料

    仿真的一點點資料,東西很多。。{:7:}
    發表于 10-16 10:07

    為什么multisim中加入大一點的芯片就無法仿真?幫幫忙吧,積分很少,實在抱歉。

    為什么multisim14.0仿真的時候好好的,加入大一點的芯片就發現仿真變得很慢,不會就提示仿真
    發表于 12-21 21:34

    一點接地,什么是一點接地,一點接地應注意的問題

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

    關于SI設計與SI仿真的一點淺見

    看到有很多人執著于信號完整性仿真,也有人提到軟件仿真與實際不相符的問題,談談我自己的些看法。
    發表于 11-30 11:16 ?5222次閱讀

    流水線ADC的行為仿真

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

    關于畫高頻PCB板的一點心得

    關于畫高頻PCB板的一點心得,感興趣的小伙伴們可以看看。
    發表于 07-26 16:29 ?0次下載

    路燈藍光危害你造嗎?專家建議“冷一點,暗一點

    美國醫學會(AMA)最近接受了關于街道照明的正式政策聲明:冷一點、暗一點。其在聲明中稱,對于晚上戶外照明,尤其是街道照明,其色溫不應超過3000開爾文(K)。較高的色溫光照越白,同
    發表于 11-18 08:59 ?3317次閱讀

    Xilinx ISE是如何調用ModelSim進行仿真的

    在我們用ModelSim仿真的時候經常是修改一點一點修改代碼,這樣會造成個無奈的操作循環:修改代碼--->編譯代碼--->仿真設置--->
    發表于 02-11 15:25 ?1.1w次閱讀
    Xilinx ISE是如何調用ModelSim進行<b class='flag-5'>仿真的</b>

    關于連接量子比特的一點:量子計算

    關于連接量子比特的一點:量子計算
    的頭像 發表于 01-04 11:17 ?999次閱讀
    <b class='flag-5'>關于</b>連接量子比特的<b class='flag-5'>一點</b>:量子計算

    時序仿真與功能仿真的區別有哪些?

    種EDA仿真,它模擬個數字電路中時序的行為。時序行為通常包括數據信號傳輸的時序,如周期時間或LATCH信號的上升沿下降沿。它通常應用于驗證設計延遲、時序、時序違規和時序沖突等問題。
    的頭像 發表于 09-17 14:15 ?5841次閱讀

    包絡仿真的四個步驟過程

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