Modelsim导出数据的两种方法
生活随笔
收集整理的這篇文章主要介紹了
Modelsim导出数据的两种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 1 方法1:使用Verilog系統函數
- 1.1 需要用到的系統函數
- 1.2 例子
- 2 方法2:使用Modelsim指令
- 2.1 需要用到的Modelsim命令
- 2.2 Tcl過程編寫
- 3 附件
Modelsim保存與打開仿真波形的方式介紹了怎么保存波形,但是有時候我們需要保存仿真過程的數據進行matlab分析繪圖。
Modelsim導出數據的幾中方法:
1 方法1:使用Verilog系統函數
1.1 需要用到的系統函數
-
$fopen
multi_channel_descriptor = $fopen("file_name") ; fd = $fopen("file_name",type) ; -
$fclose
$fclose(multi_channel_descriptor) ; $fclose(fd) ; -
$fwrite/$fdisplay/$fdisplayb/$fdisplayh/$fdisplayo
file_output_task_name(multi_channel_descriptor [,list_of_arguments]); file_output_task_name(fd [,list_of_arguments]); file_output_task_name ::= $fwrite|\$fdisplay|\$fdisplayb|\$fdisplayh|\$fdisplayo -
$signed/$unsigned
$signed - returned value is signed $unsigned - returned value is unsigned
1.2 例子
以輸出無符號整數這個需求為例,RTL設計:
`timescale 1ns/1ps module top(input I_sys_clk,input I_reset_n );//--- internal signal Definitions --- //=== parameter define= == parameter P_SIM_MODE = 0; //=== reg define === reg [9:0] R_data_cnt; //=== wire define === //--- Main body of code --- always @(posedge I_sys_clk or negedge I_reset_n) beginif(~I_reset_n) beginR_data_cnt <= 10'd0;end elsebeginif(~(&R_data_cnt))beginR_data_cnt <= R_data_cnt + 10'd1;endend end//--- save data --- generateif(P_SIM_MODE)begininteger f_id;initial beginf_id = $fopen("./data/data.txt","w");endalways @(R_data_cnt)beginif (~(&R_data_cnt))begin$fwrite(f_id,"%d\n",$unsigned(R_data_cnt));//$unsigned可省略endelsebegin$fwrite(f_id,"%d\n",$unsigned(R_data_cnt));$fclose(f_id);endendend endgenerateendmoduletestbench
`timescale 1ns/1ps module top_tb ();parameter T = 10; reg I_sys_clk; reg I_reset_n;initial beginI_sys_clk <= 1'b1;I_reset_n <= 1'b0;#(T*10)I_reset_n <= 1'b1; endalways #(T/2) I_sys_clk <= ~I_sys_clk;top #(.P_SIM_MODE(1) )top_u(.I_sys_clk(I_sys_clk),.I_reset_n(I_reset_n) );endmodule仿真結果:
程序為一個R_data_cnt從0加到1023。
在save data代碼段,首先打開一個“data.txt”文本文件,然后每次R_data_cnt改變時將R_data_cnt轉換為有符號整數寫入txt文件中,寫完1023后關閉文件。
如果想要輸出其他格式,則使用$fdisplayb/$fdisplayh/$fdisplayo,分別對應2進制,16進制,8進制。另外涉及到是否自動添加換行,需要微調一下。
2 方法2:使用Modelsim指令
ModelSim導出數據至.txt文件介紹了這種方法,現在補充一下基本原理以及怎么拓展。
2.1 需要用到的Modelsim命令
- examine
兩種形式:examine和exa
功能:它檢查一個或多個對象,并在Transcript窗口中顯示當前值(或指定以前時間的值)。
語法:examine … [-delta ] [-env ] [-event ] [-handle] {[-in] [-out]
[-inout] | [-ports]} [-internal] [-maxlen ] [-expr ] [-name]
[-<radix_type>] [-radix [<radix_type>][,<radix_flag>][,…]]
[-radixenumnumeric | -radixenumsymbolic] [-showbase] [-time ] [-value]- -env: (可選)指定查找對象名稱的路徑。
- -name: 指定HDL或SystemC的目標
- -radix:(可選)進制。ascii,binary, decimal, fpoint, hexadecimal, octal, sfixed, symbolic, time, ufixed, unsigned,default, and user- defined radix names (refer to the radix define command).
- -time: (可選)指定從0到$now的某一個時間值,用于檢查對象。
2.2 Tcl過程編寫
我認為我們一般直接導出所有仿真時間段的需要的變量,所以稍微在之前的基礎上稍微修改了一版:
Tcl過程:
proc write_sim_data {env name radix cycle file} {set fid [open $file w]for {set i 0} {$i <= $::now} {incr i [expr $cycle * 1000]} {set str [exa -env $env -radix $radix -time ${i}ps {*}$name]puts $fid $str}close $fid }說明:
- line1: 定義一個名為write_sim_data的過程,參數列表為:{env name radix cycle file}
- env:指定查找對象名稱的路徑。如top_tb/top_u。
- name:需要導出的變量列表。如{I_reset_n R_data_cnt}。
- radix:進制。可選:ascii,binary, decimal,hexadecimal,unsigned等
- cycle:時鐘周期,單位ns。本例為:10
- file:輸出文件。如./1.txt。
- line2:打開一個文檔,返回文件描述符。
- line3: 分別獲得從0到仿真結尾時間,按時鐘周期間隔對數據進行取樣輸出。
- line4: 獲得具體數據。
- line5: 將數據寫入文件。
- line7: 關閉文件。
調用示例:
write_sim_data top_tb/top_u {I_reset_n R_data_cnt} unsigned 10 1.txt用法:
輸出:
3 附件
測試工程:
鏈接:https://pan.baidu.com/s/1wXj58zLa-_eq1KmOrMwuMA
提取碼:open
總結
以上是生活随笔為你收集整理的Modelsim导出数据的两种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迷你计算机工作站,掌上的迷你工作站,便携
- 下一篇: FPGA基础之modelsim常见问题