目录

  • 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
endgenerateendmodule

testbench

`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

用法:

  1. 首先在Modelsim脚本窗口输入过程定义。
  2. 然后设置好参数,调用脚本。

输出:

3 附件

测试工程:
链接:https://pan.baidu.com/s/1wXj58zLa-_eq1KmOrMwuMA
提取码:open

Modelsim导出数据的两种方法相关推荐

  1. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  2. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  3. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  4. java在文件的后面添加_java 在file的尾部添加数据的两种方法总结

    java 在file的尾部添加数据的两种方法总结 问题描述: 在文件的末尾追加内容 方法1:利用RandomAccessFile类 1.将randomAccessFile模式设置为rw 2将rando ...

  5. java构建json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  6. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法- 发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用In ...

  7. java 文件尾部_java 在file的尾部添加数据的两种方法总结

    java 在file的尾部添加数据的两种方法总结 问题描述: 在文件的末尾追加内容 方法1:利用RandomAccessFile类 1.将randomAccessFile模式设置为rw 2将rando ...

  8. 获得GPS数据的两种方法 1读串口

    获得GPS数据的两种方法 1读串口 - [技术] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://memset.blogbus.com/logs/17801310.ht ...

  9. mvc控制器接收数据的两种方法

    一.mvc控制器接收数据的两种方法 A方法: public ActionResult ProcessAdd() { string username=Request["UserName&quo ...

最新文章

  1. 脑机接口技术重大突破!首次帮助瘫痪男子恢复运动和触觉
  2. prometheus下载慢_Prometheus + Grafana 监控 SpringBoot
  3. keyProperty=“id“ 和useGeneratedKeys=“true“作用
  4. 实现树状结构_组合模式 - 树状结构的优雅实现
  5. 2017.3.23 特别行动队 思考记录
  6. File upload error - unable to create a temporary file in bUnknown/b on line
  7. 2019,跟着大佬追逐技术前沿
  8. AD14简单使用教程
  9. 函数项数列以及函数项级数收敛判别
  10. android apk 防止反编译技术第一篇-加壳技术
  11. armlinux开发板用户自动登录
  12. 华为PUSH推送所有Token都不合法
  13. 与亲哥决裂20年,董明珠被踢出族谱:帮你是情分,不帮你是本分
  14. 对c语言课程的建议和意见,对课程的意见和建议
  15. 硬盘备份到新电脑,你需要知道这个技巧
  16. 苹果手机录音怎么批量导出?才知道原来可以这样操作
  17. 电脑怎么图片转文字?建议收藏这几个方法
  18. 如何从阿里云官方镜像站下载centos并安装
  19. 微信史诗级更新:60秒长语音有救了!
  20. 什么是Java / JVM中的-Xms和-Xms参数(已更新至Java 13)

热门文章

  1. AE片头模板 闪光特效能量爆炸效果logo展示视频模板
  2. 终于有人把大数据、红海、蓝海、众筹说清楚了 (太简单粗暴了!)
  3. 八、kubernetes Pod控制器
  4. Oracle数据保护DataGuard安装和配置一
  5. 用openjweb平台开发的企业档案管理系统介绍
  6. 【AI视野·今日CV 计算机视觉论文速览 第185期】Tue, 15 Sep 2020
  7. SkyEye在航电系统冗余设计中的应用前景
  8. 提高计算机英语,【 怎样才能提高计算机英语呢 】
  9. 关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题
  10. 论文排版-CTex的基本使用方法