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

    文章

    4406

    浏览量

    66812
  • SV
    SV
    +关注

    关注

    0

    文章

    7

    浏览量

    14117
  • 仿真验证
    +关注

    关注

    0

    文章

    26

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

    概述ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合
    的头像 发表于 11-13 11:41 192次阅读
    【产品介绍】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 1049次阅读
    如<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

    Simcenter FLOEFD HVAC模块:促进对建筑环境和居住舒适度的仿真

    优势评估热舒适度HVAC系统的测试效率设计符合严苛环境法规SiemensDigitalIndustriesSoftware是建筑环境气流和温度仿真领域的领先企业。它打造
    的头像 发表于 09-25 11:40 422次阅读
    Simcenter FLOEFD HVAC模块:促进对建筑<b class='flag-5'>环境</b>和居住舒适度的<b class='flag-5'>仿真</b>

    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

    何在裸机环境中运行KleidiAI微内核

    探索如何在裸机环境中运行 KleidiAI 内核,并通过测试多款 C/C++ 编译器,以确定如何能更高效地生成代码。
    的头像 发表于 08-08 15:16 3626次阅读
    如<b class='flag-5'>何在</b>裸机<b class='flag-5'>环境</b>中运行KleidiAI微内核

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

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

    何在MATLAB中使用DeepSeek模型

    在 DeepSeek-R1(https://github.com/deepseek-ai/DeepSeek-R1) AI 模型横空出世后,人们几乎就立马开始询问如何在 MATLAB 中使用这些模型
    的头像 发表于 02-13 09:20 4048次阅读
    如<b class='flag-5'>何在</b>MATLAB<b class='flag-5'>中使</b>用DeepSeek模型

    何在Windows中使用MTP协议

    、图片等)的通信协议,它被广泛用于Android设备。以下是如何在Windows中使用MTP协议的详细步骤: 1. 确保设备支持MTP 首先,你需要确认你的设备支持MTP协议。大多数现代Android
    的头像 发表于 01-03 10:26 4396次阅读

    何在Tina-ti仿真软件中添加ads1282&amp;ads1283这两款adc?

    何在Tina-ti仿真软件中添加ads1282&ads1283这两款adc?可以给一下模板吗
    发表于 12-12 07:40