0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在基于SV的仿真环境中使用软件语言

454398 来源:AI加速微信公众号 作者:AI加速微信公众号 2020-09-27 14:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

仿真验证中,SV语言不能很好的描述复杂的计算或者流程关系,使用软件语言(比如C)就比较方便。那么当我们使用C描述了这些关系后,如何在基于SV的仿真环境中使用呢?有两种方式,一种是将C编译为可执行文件,利用系统函数进行调用。另外一种方式利用SV提供的 DPI-C接口。第一种方式并不是严格意义上的SV和C的对接,只是通过命令行执行了C程序。比如我们写了一个hello world的c程序:

int main(){

printf(“hello world!/n”);

return 0;

}

我们将其编译为可执行文件gcc -o hello hello.c

我们就可以在我们的SV函数中直接执行:

function void exe();

$system(“./hello”);

Endfunction

除了这个方式,SV还提供了和C/C++直接的接口DPI。DPI接口允许用户用C编写程序,并和SV实现对接,也可以用SV写程序,将SV程序导出到c中。二者实现了相互调用。如何要在SV中使用自己定义的C函数,需要在SV中导入函数。比如:

module Bus(input In1, output Out1);
import "DPI" function void slave_write(input int address,
input int data);
export "DPI" function write; // Note – not a function prototype

// This SystemVerilog function could be called from C
function void write(int address, int data);
// Call C function
slave_write(address, data); // Arguments passed by copy
endfunction
...
endmodule

C中为:

#include "svdpi.h"
extern void write(int, int); // Imported from SystemVerilog
void slave_write(const int I1, const int I2)
{
buff[I1] = I2;
...
}

C函数slave_write在SV中被调用,其有两个参量 address和data。在C函数中通常要包含两个头文件:svdpi.h和svdpi_src.h。

C和SV的数据类型有以下几种对应关系:

我们需要注意SV和C之间参量传递有两种方式,一种是值传递,比如byte-char,shortint-short int等,另外一种方式是通过指针传递,比如在SV中packed和unpacked的数组,是通过引用传递到C的,那么C中就使用指针来进行接收。比如bit[n:0]作为packed数组,传递到C中是用svBitVecVal*来接收的,svBitVecVal是一个宏定义,实际上就是32bit数据。在这里需要注意的是,n bit的SV数据在C中是以32bit数据存放的,按照小端排列。比如bit[127:0] a,对应的C中数据svBitVecVal* b,有以下对应关系:

a[31:0] = b[0]

a[63:32] = b[1]

这点初学者很容易掉坑里,我一开始在传递这个变量的时候以为是一个svBitVecVal存储1bit数据。在SV测的多维数据也都可以在C中使用1维指针接收,比如有以下函数:

Void write(svBitVecVal* data){

}

SV中可以为:

Import “DPI-C” function void write(bit[127:0] data[16][16]);

这样在C中读写data数据的时候就需要通过指针来确认数据位置。指针指向了数据data的第一个32bit数据,即data[0][0][31:0],之后数据往后增加指针即可得到。

对于unpacked的数组数据,在C中可以使用指针直接访问,但是在packed中的数据,却只允许使用定义的函数来读写。这些函数有:

svBit svGetSelectBit(const svBitPackedArrRef s, int i);

svLogic svGetSelectLogic(const svLogicPackedArrRef s, int i);

void svPutSelectBit(svBitPackedArrRef d, int i, svBit s);

void svPutSelectLogic(svLogicPackedArrRef d, int i, svLogic s);

/* canonical

void svGetPartSelectBit(svBitVec32* d, const svBitPackedArrRef s, int i,

int w);

svBitVec32 svGetBits(const svBitPackedArrRef s, int i, int w);

svBitVec32 svGet32Bits(const svBitPackedArrRef s, int i); // 32-bits

unsigned long long svGet64Bits(const svBitPackedArrRef s, int i); // 64-bits

void svGetPartSelectLogic(svLogicVec32* d, const svLogicPackedArrRef s, int i,

int w);

/* actual

void svPutPartSelectBit(svBitPackedArrRef d, const svBitVec32 s, int i,

int w);

void svPutPartSelectLogic(svLogicPackedArrRef d, const svLogicVec32 s, int i,

int w);

除了可以向C中传递固定维度数组,还可以传递不固定维度数组,即动态数据。在C中通过svOpenArrayHandle来获取这些数据,这些数据的操作也需要通过一些函数,不能直接操作。比如以下函数可以获得动态数组的位置:

int svLeft(const svOpenArrayHandle h, int d);

int svRight(const svOpenArrayHandle h, int d);

int svLow(const svOpenArrayHandle h, int d);

int svHigh(const svOpenArrayHandle h, int d);

比如定义一个数组bit[3:0] data[3:9],那么

svLeft(data, 1)是3,svRight(data, 1)是9。

在SV中有如下形式:

Import “DPI-C” function void write(bit[3:0] data[])

C中为:
Void write(svOpenArrayHandle data)

C函数

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67820
  • SV
    SV
    +关注

    关注

    0

    文章

    7

    浏览量

    14149
  • 仿真验证
    +关注

    关注

    0

    文章

    27

    浏览量

    8374
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    何在 S32 配置工具中添加 ADC 并在 Simulink 中使用?

    对于 S32K3,如何在 S32 配置工具中添加 ADC 并在 Simulink 中使用?
    发表于 04-07 07:09

    基于 Foster 模型的实战建模:如何在仿真软件中设置 SiC 模块的瞬态热阻参数

    基于 Foster 模型的实战建模:如何在仿真软件中设置 SiC 模块的瞬态热阻参数 碳化硅功率模块热管理挑战与瞬态热阻抗建模的工程背景 在现代电力电子工程的宏大图景中,半导体材料的演进正在深刻重塑
    的头像 发表于 03-24 08:21 208次阅读
    基于 Foster 模型的实战建模:如<b class='flag-5'>何在</b><b class='flag-5'>仿真</b><b class='flag-5'>软件</b>中设置 SiC 模块的瞬态热阻参数

    何在 S32 DS 中使用 BMS GEN2 SDK?

    do not support the BJB MC33777. 如何在 S32 DS 中使用 BMS GEN2 SDK?
    发表于 03-23 08:16

    变频器如何在可燃可爆气体环境里使用?

    在工业自动化领域,变频器作为电机调速的核心设备,其应用场景日益广泛。然而,当涉及煤矿、石油化工、天然气等存在可燃可爆气体的高危环境时,普通变频器的使用可能引发灾难性事故。如何在这样的特殊环境中安全
    的头像 发表于 03-12 17:15 576次阅读
    变频器如<b class='flag-5'>何在</b>可燃可爆气体<b class='flag-5'>环境</b>里使用?

    RDMA设计35:基于 SV 的验证平台

    ,而只对其接口(AXI-Stream 及 Config)进行仿真验证,将在一定程度上减小验证平台的复杂度和搭建的难度。基于 SV 的验证平台的整体架构如图.1 所示。 图1 基于 SV 的验证平台
    发表于 02-01 13:14

    何在AMD Vitis Unified IDE中使用系统设备树

    您将在这篇博客中了解系统设备树 (SDT) 以及如何在 AMD Vitis Unified IDE 中使用 SDT 维护来自 XSA 的硬件元数据。本文还讲述了如何对 SDT 进行操作,以便在 Vitis Unified IDE 中实现更灵活的使用场景。
    的头像 发表于 11-18 11:13 3293次阅读
    如<b class='flag-5'>何在</b>AMD Vitis Unified IDE<b class='flag-5'>中使</b>用系统设备树

    【产品介绍】Modelsim:HDL语言仿真软件

    概述ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合
    的头像 发表于 11-13 11:41 659次阅读
    【产品介绍】Modelsim:HDL<b class='flag-5'>语言</b><b class='flag-5'>仿真</b><b class='flag-5'>软件</b>

    何在VS code中配置Zephyr集成开发环境

    上一篇文章介绍了如何在VS code中使用瑞萨官方插件为RA芯片创建项目与项目调试,相信大家对RA在VS code中的开发有了基础的了解。
    的头像 发表于 11-05 14:46 1748次阅读
    如<b class='flag-5'>何在</b>VS code中配置Zephyr集成开发<b class='flag-5'>环境</b>

    何在vivadoHLS中使用.TLite模型

    本帖欲分享如何在vivadoHLS中使用.TLite模型。在Vivado HLS中导入模型后,需要设置其输入和输出接口以与您的设计进行适配。 1. 在Vivado HLS项目中导入模型文件 可以
    发表于 10-22 06:29

    E203软件仿真环境的搭建

    ,如何让E203能够在软件仿真环境下运行自己编写的C语言代码呢? 以下是我们的方案。 首先,hbird-sdkapplicationbaremetal目录下放置着一些测试程序,以he
    发表于 10-20 09:38

    运行自己编写的C语言项目的E203软件仿真环境的搭建

    ,如何让E203能够在软件仿真环境下运行自己编写的C语言代码呢? 以下是我们的方案。 首先,hbird-sdkapplicationbaremetal目录下放置着一些测试程序,以he
    发表于 10-20 06:44

    SV7321, SV7358, SV7324英文手册

    电子发烧友网站提供《SV7321, SV7358, SV7324英文手册.pdf》资料免费下载
    发表于 09-09 18:09 0次下载

    SV8541A、SV8542A、SV8544A 微功率低噪声运算放大器技术手册

    电子发烧友网站提供《SV8541A、SV8542A、SV8544A 微功率低噪声运算放大器技术手册.pdf》资料免费下载
    发表于 09-09 17:17 0次下载

    请问如何在 Keil μVision 或 IAR EWARM 中使用观察点进行调试?

    何在 Keil μVision 或 IAR EWARM 中使用观察点进行调试?
    发表于 08-20 06:29

    电磁环境仿真与验证系统软件

    电磁环境仿真与验证系统软件
    的头像 发表于 04-29 16:59 1236次阅读
    电磁<b class='flag-5'>环境</b><b class='flag-5'>仿真</b>与验证系统<b class='flag-5'>软件</b>