基于QuestaSIM的SystemVerilog DPI使用流程(step by step)
本文旨在通过一个小设计展示SystemVerilog Direct Programming Interface (DPI)的使用。这个小设计模拟了一个交通信号灯,我们将在GUI中查看代表交通信号灯信号的波形并观察Verilog函数和C语言函数调用如何改变交通信号灯的颜色。
设计和Questa SIM仿真脚本存放在工具安装目录:
<install_dir>/examples/tutorials/systemverilog/dpi_basic
在执行上图中的脚本之前需要完成三件事:
1、创建一个文件夹,将上述文件复制到这个文件夹
2、设置QUESTA_HOME环境变量(也许你在当初安装的时候已经设置过了)
3、安装gcc-4.2.1-mingw32vc9编译器到Questa SIM的安装目录中
1 module test ();
3 typedef enum {RED, GREEN, YELLOW} traffic_signal;
5 traffic_signal light;
7 function void sv_GreenLight ();
8 begin
9 light = GREEN;
10 end
11 endfunction
13 function void sv_YellowLight ();
14 begin
15 light = YELLOW;
16 end
17 endfunction
19 function void sv_RedLight ();
20 begin
21 light = RED;
22 end
23 endfunction
25 task sv_WaitForRed ();
26 begin
27 #10;
28 end
29 endtask
31 export "DPI-C" function sv_YellowLight;
32 export "DPI-C" function sv_RedLight;
33 export "DPI-C" task sv_WaitForRed;
35 import "DPI-C" context task c_CarWaiting ();
37 initial
38 begin
39 #10 sv_GreenLight;
40 #10 c_CarWaiting;
41 #10 sv_GreenLight;
42 end
44 endmodule
先看一下上述的测试文件test.sv
line1和line44给测试平台一个名字test,在其中执行各种仿真活动
line3和line5定义一个枚举变量light,这是后续操作的对象
line7~line11、line13~line17和line19~line23分别定义了SystemVerilog function,前缀sv_指明这是SystemVerilog语言编写的function
line25~line29定义了SystemVerilog task,前缀sv_指明这是SystemVerilog语言编写的task。这个task内包含了延时,所以不能用function实现。
line31~line33是SystemVerilog DPI的关键,使用关键字“export”使指定的function或task对于C语言可见,并且其名称必须放在特殊的name space中。
line35"import"声明用于将C世界的代码导入到Verilog世界中
#include "dpi_types.h"
int c_CarWaiting()
{
printf("There's a car waiting on theother side. n");
printf("Initiatechange sequence ...n");
sv_YellowLight();
sv_WaitForRed();
sv_RedLight();
return 0;
}
在这里我们可以发现SystemVerilog DPI是以SystemVerilog为中心的。当你希望让SystemVerilog中的function或task对C语言可见时,需要将其export到C语言世界。同样,如果你想让SystemVerilog代码看到并访问C语言世界中的某些内容,则需要将其import到SystemVerilog
在Windows平台下,我们之间双击这个windows.bat文件
vlib work
vlog test.sv -dpiheader dpi_types.h foreign.c
vopt +acc test -o opt_test
vsim -i opt_test -do "add wave light; view source"
然后执行
VSIM 3> run
# There's a car waiting on the other side.
# Initiate change sequence ...
- 【实践操作】在iPhone上创建你的第一个机器学习模型
- WP8微信5.3开始内测 支持Cortana语音 两微破冰了?
- 数据库进程间通信解决方案之MQ
- Extjs4.2 rest 与webapi数据交互----顺便请教了程序员的路该怎么走
- 这或许是对小白最友好的python入门了吧——7,组织列表
- 这或许是对小白最友好的python入门了吧——6,删除列表元素
- 集群开源软件赏:JGroups
- 看到他我一下子就悟了---委托
- 这或许是对小白最友好的python入门了吧——5,修改和添加列表元素
- 这或许是对小白最友好的python入门了吧——4,列表
- 【深度学习】自动驾驶:使用深度学习预测汽车的转向角度
- 这或许是对小白最友好的python入门了吧——3,数字处理
- 数据库恢复方案
- 这或许是对小白最友好的python入门了吧——2,变量和字符串
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法