如何將FPGA設計驗證效率提升1000倍以上(1)

我們將以三個設計樣例,助力您提升設計開發效率。

對于FPGA應用開發來說,代碼是寫出來的,更是調試出來的。軟件仿真擁有最佳的信號可見性和調試靈活性,被大多數工程師熟練使用,能夠高效捕獲很多顯而易見的常見錯誤。

然而,由軟件實現的數字仿真過程運行速度有限,很難做到100%代碼覆蓋。導致那些隱藏的設計問題,將不可避免的逃逸,只能以FPGA 在線調試方式解決。換而言之,硬件在線調試將成為查找設計bug、解決設計潛在缺陷的最后防線。

如果對處于全速(at-speed)運行下的FPGA調試,在現有通用“能力技術”基礎上,再增加“硬件斷點”功能,那么也就對高速運行FPGA,擁有像調試軟件程序類似的完整的可控制能力:

  • 凍結時鐘,FPGA“原地”保持靜止不動,獲取周期精確的信號數據;
  • 釋放時鐘:就像松開了FPGA“剎車片”,繼續恢復至全速運行狀態。

以賽靈思FPGA為例,用戶已經能從硬件的運行特征出發,為設計增加兩類硬件斷點:

其中最基礎的是時鐘斷點(Clock-based Breakpoint),可視為“運行時鐘周期數觸發的中斷”,即FPGA設計在運行過程中,一旦遇到時鐘斷點,立即暫停執行,原地原位保持靜止狀態,用于獲取周期精確的信號數據。

  • 用戶在設計階段,只需將下面的鐘斷點控制模塊(interruption logic),事先集成到待測DUT的頂層(hw_top),就可獲得這樣的在線調試能力。

本文是系列文章的第一篇,將以最基礎的 counter設計作為樣例,以按圖索驥的方式,詳細介紹在設計中集成時鐘斷點的實現過程,對原有設計的改動非常小,仍然保持優異的時序性能。

以下為正文

1.樣例簡要介紹

輸入時鐘為125 MHz,按秒計時輸出,由8個LED燈循環顯示當前讀秒計數。對應的頂層設計top.v如下:

//===========================================================================
// top.v 
//===========================================================================
module top(input gclk,input reset,  output [7:0] count_o
);wire [26:0] i_counter;// instantiate module countcount inst_count (.rst       (reset),.clk       (gclk),.count_out (count_o),.count     (i_counter));
endmodule//===========================================================================
// count.v
//===========================================================================
module count (clk,rst,count_out,count
);input rst;                // Active low resetinput clk;                // 125MHz input clockoutput reg [7:0] count_out;   // Output to LEDsoutput reg [26:0] count;//Counter to reduce speed of outputalways @(posedge clk)if (!rst) begincount <= 0;endelse begin count <= count + 1;endalways @(posedge clk)if (!rst)count_out <= 8'h00;else beginif (count == 27'h773_5940) begincount_out <= count_out + 1;endendendmodule

對應的約束文件:

#Arty A7-35T Pinout## Clock signal
create_clock -name gclk -period 8.000 [get_ports gclk]
set_property IOSTANDARD LVCMOS33 [get_ports { gclk }]
set_property PACKAGE_PIN E3 [get_ports { gclk }]#Counter 8-bit input and outputs - RST signal and LED indicators
## 4 LEDs
## Blue LEDs for another 4 led counting
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {count_o[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports reset]set_property PACKAGE_PIN H5 [get_ports {count_o[0]}]
set_property PACKAGE_PIN J5 [get_ports {count_o[1]}]
set_property PACKAGE_PIN T9 [get_ports {count_o[2]}]
set_property PACKAGE_PIN T10 [get_ports {count_o[3]}]
set_property PACKAGE_PIN E1 [get_ports {count_o[4]}]
set_property PACKAGE_PIN G4 [get_ports {count_o[5]}]
set_property PACKAGE_PIN H4 [get_ports {count_o[6]}]
set_property PACKAGE_PIN K2 [get_ports {count_o[7]}]
set_property PACKAGE_PIN A8 [get_ports reset]

當您按照創建Vivado設計項目,導入以上約束文件時,請按照自己的硬件板卡定義進行修改。

2.? 時鐘斷點控制模塊

該模塊位于forgedaX軟件/breakpoint/controller/clock-based子目錄。

module interruption_logic((* dont_touch = "true" *) output reg [63:0] cycles,input sys_clk,input sys_reset,output task_clk
);wire clk_en;wire [63:0] breakpoint;reg [63:0] counter;reg break;il_vio_0 il_vio (.clk(sys_clk),.probe_in0(counter),.probe_in1(cycles),.probe_out0(breakpoint),.probe_out1(clk_en));always @(posedge sys_clk)beginif (!sys_reset)begincounter <= 0;break <= 0;endelse if (clk_en)beginif (counter == breakpoint)beginbreak <= 1'b1;endelsebegincounter <= counter + 1;break <= 1'b0;endendendBUFGCE inst_bufgce (.O(task_clk),.I(sys_clk),.CE(clk_en & ~break));always @(posedge task_clk)beginif (!sys_reset) begincycles <= 0;end  elsebegincycles <= cycles + 1;endendendmodule

該模塊非常精簡,對您的原生設計的改動很小,所占用的硬件資源也非常少,應用設計在集成斷點后,仍然保持優異的時序性能。

在本樣例中,該斷點控制模塊僅使用了不到700個LUT,在7A35T芯片總計20800個LUT資源中,占比約為3.36%。

3.??將時鐘斷點模塊集成到設計中

時鐘斷點控制模塊與原有設計的融合集成,全程在Xilinx Vivado環境下完成,共有三個步驟。

Step 1. 導入斷點控制模塊

在Vivado Project Manager中,選擇“Add Source”

選擇“Add or create design Source”,單擊“Next”

選擇“Add Files”

選擇forgedaX軟件提供的時鐘斷點控制模塊interruption logic。

模塊代碼位于breakpoint/controller/clock-based/interruption_logic_v1.v,單擊“OK”。

單擊“Finish”,確認導入該模塊文件。

模塊成功導入,在Project Manager中顯示如下:

Step 2. 導入斷點控制模塊所使用的VIO IP

在Vivado中,選擇“IP Catalog”,導入VIO IP核。

在IP Catalog搜索框中,直接輸入VIO,顯示如下:

在Customize IP核界面,對VIO IP進行參數設置:

設置兩個輸出端口的參數:

點擊“OK”,確認以上參數配置。

在IP生成對話框中,保持默認設置,點擊“Generate”,生成VIO IP核。

顯示“Generation of output products completed successfully”消息,表示IP核已成功導入。

在Project Manager窗口顯示如下:

Step 3. 在頂層設計中,對中斷控制模塊進行實例化,獲得受控的時鐘信號

對設計頂層(hw_top)的時鐘進行處理,對原有設計的改動非常少,就可實現對該時鐘控制模塊的融合集成,兩者的比對如下:

備注:在本樣例中,原始設計的頂層文件位于

<forgedaX軟件目錄>/demo/vivado_counter/counter/counter.srcs/sources_1/imports/Source/top.v

集成斷點控制模塊后的頂層文件,詳見:

<forgedaX軟件目錄>/demo/vivado_counter_clk_bp/counter-bp/counter-bp.srcs/sources_1/imports/Source/top.v

4.? 重新啟動Vivado編譯過程

啟動Vivado編譯,生成新的設計結果文件(.dcp), 得到的配置位流文件top.bit,以及調試支撐文件debug_nets.ltx。

5.? 用Hardware Manager驗證斷點的集成過程

您可直接在Vivado Hardware Manager中,驗證以上集成過程是否正確。

當對應的位流文件、調試支撐文件載入到FPGA之后,樣例設計暫停運行。打開VIO調試窗口,選擇Add Probes:

如下圖所示,斷點地址位于以上第2部分設置的初始值,即0xF。

繼續在VIO窗口,將斷點地址設置為FFFF_FFFF_FFFF_FFFF,清除斷點,樣例繼續全速運行,如下圖。

以上兩個操作正確完成,標志著時鐘斷點已成功集成到本樣例設計中。

后續將介紹事件斷點(Event-based Breakpoint)的集成和使用,持續更新中。

全文完,感謝您的耐心閱讀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86377.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabbitMQ 利用死信隊列來實現延遲消息

RabbitMQ 利用死信隊列來實現延遲消息 基于 TTL&#xff08;Time-To-Live&#xff09; 死信隊列&#xff08;DLX&#xff09;的方式來實現延遲消息 首先消息會被推送到普通隊列中&#xff0c;該消息設置了TTL&#xff0c;當TTL到期未被消費掉&#xff0c;則會自動進入死信隊列…

Keepalived+Haproxy+Redis三主三從

一、集群部署 1、案例拓撲 2、資源列表 主從節點是隨機分配的&#xff0c;下屬列表只是框架&#xff1a; 操作系統主機名配置IP應用OpenEuler24master12C4G192.168.10.101RedisOpenEuler24master22C4G192.168.10.102RedisOpenEuler24master32C4G192.168.10.103RedisOpenEule…

Modbus轉IEC104網關:電力自動化系統的橋梁

現代電力系統中&#xff0c;變電站、發電廠以及配電網絡中存在大量采用不同通信協議的設備。Modbus協議因其簡單易用在現場設備中廣泛部署&#xff0c;而電力行業主流監控系統則普遍采用IEC 60870-5-104&#xff08;簡稱IEC104&#xff09;協議。協議差異導致的數據孤島現象&am…

@annotation:Spring AOP 的“精準定位器“

想象你是一位快遞員&#xff0c;負責給一個大型社區送快遞。社區里有幾百戶人家&#xff0c;但只有特定家庭需要特殊服務&#xff1a; 普通快遞&#xff1a;直接放快遞柜生鮮快遞&#xff1a;需要冷藏處理貴重物品&#xff1a;需要本人簽收藥品快遞&#xff1a;需要優先配送 …

Web Worker使用指南 解鎖瀏覽器多線程 ,提升前端性能的利器

文章目錄 前言一、什么是 Web Worker二、適用場景1、CPU 密集型計算2、圖像/視頻處理3、實時數據流處理&#xff08;高頻場景&#xff09;4、后臺文件操作5、復雜狀態機/AI邏輯&#xff08;游戲開發&#xff09;6、長輪詢與心跳檢測7、WebAssembly 加速8、WebGL 與 Canvas 渲染…

React 18.2.0 源碼打包

一、React源碼地址 GitHub&#xff1a;React 二、參考文章 sourcemap實戰-生成react源碼sourcemap Rollup中文文檔 JavaScript Source Map 詳解 全網最優雅的 React 源碼調試方式 三、打包操作 安裝依賴 // 全局安裝yarn npm i -g yarn // 源碼項目目錄下執行yarn安裝依賴…

UniApp 開發第一個項目

UniApp 開發第一個項目全流程指南,涵蓋環境搭建、項目創建、核心開發到調試發布,結合最新實踐整理而成,適合零基礎快速上手: ?? 一、環境準備(5分鐘) 安裝開發工具 HBuilderX(官方推薦IDE):下載 App 開發版,安裝路徑避免中文或空格 微信開發者工具(調試小程序必備…

Web項目開發中Tomcat10+所需的jar包

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 項目背景 Web項目中使用低版本Tomcat時常用的jar包如下&#xff1a; javax.servlet-apijavax.ejb-apijavax.jms-apijavax.json-api 當Web項目使用Tomcat10的版本時&#…

網絡安全就業方向與現實發展分析:機遇、挑戰與未來趨勢

網絡安全行業的戰略地位與就業背景 在數字經濟蓬勃發展的今天&#xff0c;網絡安全已從技術分支演變為關乎國家安全、企業存亡和個人隱私的核心領域。根據國家網信辦數據顯示&#xff0c;2025年我國網絡安全人才缺口達200萬人&#xff0c;較2023年增長33%。這一現象源于三重驅…

iOS runtime隨筆-消息轉發機制

運行時的消息轉發分三步, 當你調用了沒有實現的方法時, 有機會通過runtime的消息轉發機制補救一下 resolveInstanceMethod/resolveClassMethod 這里可以動態去創建方法來解決CrashforwardingTargetForSelector ?????第一步未解決, 就會走到這里, 可以給出一個Target去轉發…

vue3用js+css實現輪播圖(可調整堆疊程度)

先看效果 html <divclass"outer"style"width: 650px;background: #fff;box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.1);border-radius: 15px;margin: 0 10px 15px 5px;">//這里用的是svg-icon,需要的可自行替換為其他圖片<svg-iconid"btn_l&q…

Three.js項目實戰:從零搭建小米SU7三維汽車

大家如果有過購車的經驗&#xff0c;肯定會先從網站上收集車輛的信息&#xff0c;比如懂車帝&#xff0c;汽車之家&#xff0c;這些網站上逼真的看車效果是如何實現的呢&#xff0c;這節課帶你從0-1快速的手搓一個看車小項目。 懂車帝官網 效果 視頻教程和筆記 大家可以下方小…

Android13 永久關閉SELinux 權限

永久關閉 SeLinux 在cmdline中增加參數androidboot.selinuxpermissive&#xff1b; 芯片: QCM6115 版本: Android 13 kernel: msm-4.19 ~/temp_code/SLM927D_LA.UM.9.15$ git diff device/qcom/bengal/BoardConfig.mk diff --git a/device/qcom/bengal/BoardConfig.mk b…

Linux創建DHCP服務

Linux可作為DHCP服務端使用&#xff0c;為同一個網絡下的其它機器動態分配ip。在一些情況下&#xff0c;可以起到很大的作用。 二級標題 安裝dnsmasq # ubuntu sudo apt update -y sudo apt install -y dnsmasq# centos sudo yum install -y dnsmasq修改配置文件 sudo vim …

汽車4G-TBOX智能終端 汽車國標GB/T 32960協議

汽車國標GB/T 32960協議4G TBOX是一種廣泛應用于車聯網的設備&#xff0c;下面將從不同方面為你詳細介紹。 移動管家汽車4G-TBOX智能終端定義與用途 4G TBOX是基于車聯網技術智能服務系統中的采集終端。以車云網的4G TBOX_CC750為例&#xff0c;它為整個智能服務系統提供GPS/…

JavaEE-Mybatis初階

什么是MyBatis MyBatis是?款優秀的 持久層 框架&#xff0c;?于簡化JDBC的開發。 MyBatis本是 Apache的?個開源項?iBatis&#xff0c;2010年這個項?由apache遷移到了google code&#xff0c;并 且改名為MyBatis 。2013年11?遷移到Github 創建項目時添加依賴 上面有…

記一次jvm機器問題定位經歷

背景 開發過程中發現機器指標異常&#xff0c;端口也hang住無響應&#xff0c;端口返回為timeout&#xff0c;對應探活檢測也失敗了。 現象 在st測試環節&#xff0c;突然每隔一段時間新接口就hang住無響應&#xff0c;觀察機器監控也發現端口探活失敗&#xff0c;看機器指標…

【機器學習深度學習】張量基本操作

目錄 一、張量基本操作 1.1 執行代碼 1.2 運行結果 1.3 代碼解析 ? 1. 創建張量&#xff08;tensor、randn、zeros&#xff09; ? 2. 索引與切片&#xff08;類似 NumPy&#xff09; ? 3. 形狀變換&#xff08;reshape、轉置、壓縮&#xff09; ? 4. 數學運算&#x…

【微信小程序】8、獲取用戶當前的地理位置

1、獲取當前的地理位置 獲取當前的地理位置、速度。當用戶離開小程序后&#xff0c;此接口無法調用。開啟高精度定位&#xff0c;接口耗時會增加&#xff0c;可指定 highAccuracyExpireTime 作為超時時間。 注意&#xff1a; 地圖相關使用的坐標格式應為 gcj02。高頻率調用會…

Jenkins 常用定時構建腳本

Jenkins 常用定時構建腳本 Jenkins 使用 cron 風格的語法來配置定時構建任務&#xff0c;以下是常用的定時構建腳本示例和說明&#xff1a; 基本語法 Jenkins 定時構建使用五個字段表示時間&#xff0c;格式為&#xff1a; MINUTE HOUR DOM MONTH DOWMINUTE - 分鐘 (0-59)H…