电力电子转战数字IC20220610day21——杂七杂八
目錄
SV DAY5
025測試的開始和結束
026 調試方法
打印消息$display()
斷點breakpoint
實驗0代碼解讀
調整一下結構,先從主要的學習記錄開始,生活記錄和一些筆記分享放在最后面。
SV DAY5
025測試的開始和結束
系統函數$finish()和$stop()
前者是結束仿真,使得仿真退出,將控制權交回給操作系統,仿真不能再次繼續
后者是暫停,還可以讓仿真繼續運行
module tb; bit clk; initial begin forever #5ns clk<=!clk; end counter dut(clk);//時鐘交給dut initial begin #500ns; //仿真跑了500ns $finish();//停止仿真 end endmodule對于下面這段代碼,如果在仿真開始時在命令窗口敲入run 0,哪些行為會開始執行?
答:assign在0時刻會執行一次,always必須等到信號變化才會執行
module simstart1;logic a1=0; logic a2, a3, a4, a5; bit rstn, clk;assign a2 = a1; // assigninitial begin // initiala3 = a1; endalways @(posedge clk, negedge rstn) begin // sequential logicif(rstn === 'b0) a4 <= 0;else a4 <= a1; endalways @(a1) begin // combination logica5 <= a1; endinitial begin#10ns rstn <= 0;#20ns rstn <= 1; endinitial forever #5ns clk <= !clk;endmoduleprogram
SV中將每一個program作為一個獨立的測試,如果tb中有多個program,要等到所有program中最后一個initial過程塊完成后才能結束仿真。
?如果program沒有指定時間,那也無法自動結束,可以內置入$exit()來要求program強行結束。
$exit()的program結束后也會等待其他program執行完才結束仿真。
progra是軟件的領地,不可以出現和硬件行為相關的過程塊和實例:always,module,interface,也不可以出現其他program的例化語句
為了順序執行program,可以內部定義變量(內部變量賦值要用阻塞賦值,但是驅動外部硬件信號時用非阻塞賦值),發起多個initial塊
建議設計的部分放在module,測試采樣部分放在program
至此,總結一下
module是硬件域,interface是中間域,program和class是軟件域
驗證環境建立獨立的測試盒子,可以考用program消除采樣競爭的問題、自動結束測試用例;
可以用module,使用interface clocking消除采樣競爭,用系統方法stop和finish結束測試用例。
026 調試方法
Library庫是編譯的產物,包括硬件,軟件(類,方法),包package
打印消息$display()
通過傳遞$time顯示消息發生的時間點
%x/d/b/s/t 分別表示十六進制 十進制 二進制 字符串 時間,這些是數據格式
還有$ warning() $error() $ fatal() 分別是警告,錯誤,嚴重,數據比對錯誤時用error而不是display
用$sformatf()對字符串string賦值:string s= $sformatf("hello, %s!", name_s)
name_s是名字的字符串變量
斷點breakpoint
程序在斷點處暫時停止,可以查看在斷點的變量數值,特別是那些無法出現在波形窗口的變量,軟件程序function task object里面局部變量。也就是動態變量
用來調試程序執行的順序
在view-locals查看局部變量
問:第8行和第14行的斷點,result分別是多少?
module breakpoint1;int val1; int val2;//聲明了兩個靜態變量,module里面的變量都是靜態的int result;//靜態function int incr_static(input int a);//函數也是靜態的函數result = a + 1;return result; endfunctionfunction automatic int incr_dynamic(input int a);//除非加了automaticint result;//動態result = a + 1;return result; endfunctioninitial begin//調用靜態函數val1 = 0;val1 = incr_static(val1);val1 = incr_static(val1); // breakpoint line8 result == ? endinitial begin//調用動態函數val2 = 0;val2 = incr_dynamic(val2);val2 = incr_dynamic(val2); // breakpoint line14 result == ? endendmodule?剛執行到第8行,但是第8行并沒有執行完,所以result還沒完成a+1,所以答案是0,1
在命令窗口使用log -r/*,在開始仿真前調用,確保tb層次下所有信號都可以保存到數據庫以供查看任何信號的波形。
然后run 100ns。
實驗0代碼解讀
?MCDF結構如圖,3個通道連著3個FIFO,一個寄存器,一個arbiter,最后是輸出數據的formater
// module slave_fifo ( input clk_i, // Clock input input rstn_i, // Reset signal input [31:0] chx_data_i, // 通道數據輸入---->From outside input a2sx_ack_i, // Read ack ---->From Arbiter input chx_valid_i, // 通道數據高位有效--->From Outsideoutput reg [31:0] slvx_data_o, // Data Output ---->To Arbiter output [5:0] slvx_margin_o, // Data margin ---->To Outside output reg chx_ready_o, // Ready to accept data--->To outside output reg slvx_val_o, // Output data is valid--->To Arbiter output reg slvx_req_o // Request to send date--->To Arbiter ); //聲明內部變量,FIFO需要用到指針// reg [5:0] wr_pointer_r; reg [5:0] rd_pointer_r; reg [31:0] mem [0:31]; //FIFO寬度32深度32//聲明幾個net類型的變量,分別是FIFO滿了,空了,可以讀的信號,還有數據空間裕量// wire full_s, empty_s, rd_en_s ; wire [5:0] data_cnt_s;//同步FIFO空滿的標志,指針完全相同則為空,最高位相反其他位相同則為滿// assign full_s = ({~wr_pointer_r[5],wr_pointer_r[4:0]}==rd_pointer_r); assign empty_s = (wr_pointer_r == rd_pointer_r);//cnt用來計算FIFO還有多少空間? assign data_cnt_s = (6'd32 - (wr_pointer_r - rd_pointer_r)); assign slvx_margin_o = data_cnt_s;assign rd_en_s = a2sx_ack_i;//如果不滿,ready信號置1,表示可以進來數據// always @ (*) //ready signal begin if (!full_s) chx_ready_o = 1'b1; else chx_ready_o = 1'b0; end//如果不空,req信號置1,表示可以發送數據,和上面可以同時出現// always @ (*) //reset signal begin if (!rstn_i) slvx_req_o = 1'b0;else if (!empty_s) slvx_req_o = 1'b1; else slvx_req_o = 1'b0; end //寫指針的定義,由于是同步FIFO,不用跨時鐘域轉換格雷碼 always @ (posedge clk_i or negedge rstn_i) begin : WRITE_POINTERif (!rstn_i) beginwr_pointer_r <= 6'b0000;end else if (chx_valid_i && chx_ready_o) beginwr_pointer_r <= wr_pointer_r + 6'b0001;end end//讀指針 always @ (posedge clk_i or negedge rstn_i) begin : READ_POINTERif (!rstn_i) beginrd_pointer_r <= 6'b0000;end else if (rd_en_s && (!empty_s)) beginrd_pointer_r <= rd_pointer_r + 6'b0001;end end//若無復位信號,且read使能信號高位,FIFO不空,則valid信號置1,表示可以輸出(讀)數據 always @ (posedge clk_i or negedge rstn_i) beginif (!rstn_i) slvx_val_o <= 1'b0;else if (rd_en_s && (!empty_s))slvx_val_o <= 1'b1;else slvx_val_o <= 1'b0; end // 將mem中的數據給到輸出 always @ (posedge clk_i ) begin : READ_DATA if (rstn_i && rd_en_s && (!empty_s)) beginslvx_data_o <= mem[rd_pointer_r[4:0]];end end// 將外部輸入數據寫給mem always @ (posedge clk_i) begin : MEM_WRITEif (rstn_i && chx_valid_i && chx_ready_o) beginmem[wr_pointer_r[4:0]] <= chx_data_i;end endendmodule——————————————————————————————————————————
下個月要續保了,今天了解了汽車保險的東西,簡單總結如下:
4s報價出來的也是各個保險公司報的價,只是其中的一種渠道。保險公司的渠道有很多,4s店,修車店,財險,壽險。每個渠道的報價都可能不一樣。注意不要被4s店的一些跨年優惠券捆綁死就好
臭氧標價680,實際只值20塊錢。
每出一次險明年保費大概增加10%,是復利的算法,兩次21%,如果沒出險,會降,但是現在會看過去三年的出險情況,所以不是直接降10%了
所以,不要隨意出險,劃痕一兩副漆找熟人修車店補就好了。凱美瑞的漆報價是500,不要經常補漆,時間長了補的位置會變色,補漆就是底漆+面漆+亮油,時間長溫度高會掉。這個價位的車,劃痕險買2k額度就夠了,好車才需要高額度劃痕險
車損險包括了很多險種,比如涉水這些。
乘客險不太推薦,額度少。推薦駕乘險,按座位算,只認座位不認人。可以比較兩種險的保費和額度,一目了然。
油卡有開專票返點的操作空間,暫時沒有這個條件,就不記錄了。
維修還是推薦去4s店,除了換機油,補漆也是,漆會更匹配
——————————————————————————————————————————
起床后在家看了一集紀錄片,《富豪谷底求翻身》1.1
確實很干貨。
?
這哥們成功拉了一個小團隊,花1k刀找個律師聊完發現營業執照至少要三個月才能批下來。?
———————————————————————————————————————————論文投稿
一個二區的期刊,光是看要求都看半天,跟上次那個不同的是,要有兩個word文檔,聲明和基金的利益關系,以及作者承諾原創性和無重復投稿等。
總結
以上是生活随笔為你收集整理的电力电子转战数字IC20220610day21——杂七杂八的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npm run dev 在本地调试出现跨
- 下一篇: cout输出数组_让程序从1开始一直执行