简介

供SV,无论是构建测试激励,或模拟硬件的并行行为,DPI这是非常方便。上次我们介绍SV内通“import”导入和电话C性能。

在本节,通过一个简单的例子来说明C什么语言的函数调用SV的task和function。

1,SV部分

/*
* test.v Rill create for dpi test at 2014-10-20
*/ `timescale 1ns/1ns module tb;
import "DPI-C" context function int c_func(input int num);// or import "DPI-C" context task c_display(input int num); reg tmp; initial begin
#10
tmp = c_func(1);
end m1 M1();
m2 M2(); endmodule // top module m1;
import "DPI-C" context function void c_get_m1_scope();
export "DPI" function m1_add; reg tmp;
reg [7:0] m1_value; function int m1_add(input [7:0] num);
m1_add = num + m1_value; //or return (num + m1_value);
endfunction // m1_add initial begin
c_get_m1_scope();
m1_value = 8'd100;
end endmodule // m1 module m2;
import "DPI-C" context function void c_get_m2_scope();
export "DPI-C" task m2_add; reg tmp;
reg [31:0] m2_value; task m2_add(input int num,output int sum);
sum = num + m2_value;
endtask // m2_add initial begin
c_get_m2_scope();
m2_value = 32'd200;
end endmodule // m1

2,C部分

/*
* test.c Rill create for dpi test at 2014-10-20
*/ #include <stdio.h>
#include <svdpi.h> svScope tmp_scope;
svScope m1_scope;
svScope m2_scope; //import task/funcs from sv
extern int m1_add();
extern int m2_add(); //==scope switch
void c_get_tmp_scope(void)
{
tmp_scope = svGetScope();
} void c_set_tmp_scope(void)
{
svSetScope(tmp_scope);
} void c_get_m1_scope(void)
{
m1_scope = svGetScope();
} void c_set_m1_scope(void)
{
svSetScope(m1_scope);
} void c_get_m2_scope(void)
{
m2_scope = svGetScope();
} void c_set_m2_scope(void)
{
svSetScope(m2_scope);
} //==export c funcs to sv
int c_func(int num)
{
int m1 = 0;
int m2 = 0; c_get_tmp_scope();
c_set_m1_scope();
m1 = m1_add(num);
c_set_tmp_scope();
printf("m1:%d\n",m1); c_get_tmp_scope();
c_set_m2_scope();
m2_add(num,&m2);
c_set_tmp_scope();
printf("m2:%d\n",m2); return 0;
}

3,脚本

#! /bin/bash

#
# test.sh
# usage: ./test.sh c/w/r
# Rill create 2014-10-20
# TOP_MODULE=tb tcl_file=run.tcl CDS_INST_DIR=/home/openrisc/opt/edatools/IUS08.20 if [ $# != 1 ];then
echo "args must be c/w/r"
exit 0
fi if [ $1 == "c" ]; then
echo "compile rtl lib..."
ncvlog -f ./vflist -sv -update -LINEDEBUG;
ncelab -delay_mode zero -access +rwc -timescale 1ns/10ps ${TOP_MODULE} echo "compile dpi lib"
if [ -e libdpi.so ];then
rm libdpi.so -f
fi gcc -fPIC -shared -o libdpi.so test.c -I$CDS_INST_DIR/tools/inca/include
exit 0
fi if [ -e ${tcl_file} ];then
rm ${tcl_file} -f
fi
touch ${tcl_file} if [ $1 == "w" ];then
echo "open wave..."
echo "database -open waves -into waves.shm -default;" >> ${tcl_file}
echo "probe -shm -variable -all -depth all;" >> ${tcl_file}
echo "run" >> ${tcl_file}
echo "exit" >> ${tcl_file}
fi if [ $1 == "w" -o $1 == "r" ];then
echo "sim start..."
ncsim ${TOP_MODULE} -input ${tcl_file}
fi echo "$(date) sim done!"

4,说明

细致体会我们上面构造的样例,有几个问题须要弄清楚。

a。scope的含义:

在SV端。m1是不能直接调用m2中的task/function的。所以m1里面调用的C函数也不能直接调用m2中export出来的task/function。假设想调用,必须进行scope切换。

b。SV端,有task和function的区分。可是在C端,并没有区分,一律是C函数。

5,关于用C模拟硬件的并行行为

方式a,将流水后面的模块写在前面。这样的方式我们之前介绍过(http://blog.csdn.net/rill_zhen/article/details/8464930),这里不再赘述。

方式b,将全部并行的信号写成例如以下形式:

用c,n两个变量模拟reg的值。

用init和update两个函数模拟reg的行为。

/*
* parallel.c Rill create for simulater test at 2014-10-20
*/ struct signal; struct sig_ops
{
int (*init) (struct signal*);
int (*update) (struct signal*);
}; struct signal
{
unsigned int c; //current cycle value
unsigned int n; //next cycle value char name[32];
struct sig_ops* ops;
}; /* veritual functions
int sig_init(struct signal* signal)
{
return signal->ops->init(signal);
} int sig_update(struct signal* signal)
{
return signal->ops->update(signal);
}
*/ //actual functions
int test_init(struct signal* signal)
{
signal->c = 0;
signal->n = 0;
return 0;
} int test_update(struct signal* signal)
{
signal->c = signal->n;
return 0;
} int signal_create(struct signal* signal,char * name)
{
signal->name = name;
} //============main.c====================//
//example signal
struct signal test;
struct sig_ops test_ops =
{
test_init,
test_update,
}; int main()
{
signal_create(&test,"test");
//when reset
test->ops->init(&test);
//per cycle
test->ops->update(&test); return 0;
}

数字IC设计-15-DPI(延续)的更多相关文章

  1. VerilogHDL概述与数字IC设计流程学习笔记

    一.HDL的概念和特征 HDL,Hard Discrimination Language的缩写,翻译过来就是硬件描述语言.那么什么是硬件描述语言呢?为什么不叫硬件设计语言呢?硬件描述语言,顾名思义就是 ...

  2. 数字IC设计入门书单

    首发于观芯志 写文章     数字IC设计入门书单 Forever snow   1 年前 作者:Forever snow链接:你所在领域的入门书单? - 知乎用户的回答来源:知乎著作权归作者所有,转 ...

  3. 数字IC设计工程师的知识结构

    刚毕业的时候,我年少轻狂,以为自己已经可以独当一面,庙堂之上所学已经足以应付业界需要.然而在后来的工作过程中,我认识了很多牛人,也从他们身上学到了很多,从中总结了一个IC设计工程师需要具备的知识架构, ...

  4. 【转载】数字IC设计流程及开发工具

    原文链接:https://www.zhihu.com/question/28322269/answer/42048070 Design Flow &amp;lt;img src="h ...

  5. 数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例

    一.前言 毕业论文答辩结束,闲下来写篇文章.芯片研发人员都在Linux系统下借助各种EDA工具和代码语言完成工作,因此提高代码开发效率,熟练运用开发工具是十分必要的.本文讲述VIM编辑神器的veril ...

  6. 数字IC设计工程师成长之路

    学习的课程 仿真工具VCS实践学习 2019年12月9日-2019年12月23日

  7. 数字IC前后端设计中的时序收敛(五)--Max Transition违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...

  8. 数字IC前后端设计中的时序收敛(四)--Max Capacitance违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...

  9. 数字IC前后端设计中的时序收敛(三)--Hold违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...

随机推荐

  1. C++经典面试题(二)

    近期看一些面试题,认为假设自己被问到了,并不能非常利落的回答出来. 一是从来没有这个意识,二是没有认真的梳理下. 以下对这些题做出分析,哈!个人能力有限,当中难免有疏漏,欢迎大家补充咯. 11.引用与 ...

  2. 跨平台移动框架iMAG开发入门

    iMAG是一个非常简洁高效的移动跨平台开发框架,开发一次能够同一时候兼容Android和iOS平台,有点儿Web开发基础就能非常快上手.当前移动端跨平台开发的框架有非常多,但用iMAG另一个优点,就是 ...

  3. vim使用(三):.viminfo和.vimrc

    1. viminfo 在vim中操作的行为,vim会自己主动记录下来,保存在 ~/.viminfo 文件里. 这样为了方便下次处理, 如:vim打开文件时,光标会自己主动在上次离开的位置显示. 原来搜 ...

  4. Android 反编译(一,apktool+smail2java)

    一:解压缩(获取图片等资源) 对于apk中丰富的资源,假设我们在练习的时候须要引用某些apk中的资源文件时,最简单的办法使用解压缩工具对apk进行解压缩,然后在对应的文件夹下查找须要的资源文件. 二: ...

  5. Golang 1.3 发布时间。最终找到地方下载。

    golang 1.3 已发布 但golang.org官方网站被封锁不能下载. 最终找到一个镜像站点. http://golang.so/ http://tip.golang.so/ golang中国的 ...

  6. add-apt-repository

    也许你早已注意到,我们在介绍软件的时候,在安装这块一般都提供 PPA 源安装方式,这是一种快速方便的软件安装方法,但对于一些新手来说,对 PPA 并不是很熟悉,下面我们就详细介绍一下. # 我们先了解 ...

  7. Java Web整合开发(附录2) -- NetBeans的(默认)快捷键

    1.完成代码:ctrl+\ //任何地方按下此组合键,均会提示相应的参考字段: 2.错误提示:alt + enter //顾名思义,当系统报错时,按下此组合可以查看系统提示: 3.自动完成字符串: c ...

  8. WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

    原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...

  9. DiskFileUpload类别

    1.2.2 DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发者通过这个类来与Apache文件上传组件进行交互.以下介绍DiskFileUp ...

  10. FusionCharts简明教程(一)---建立FusionCharts图形

    由于该项目需要的报告需要做的事情,选择FusionCharts作为一种工具. 由于该报告没有任何接触,网上有没有更具体fusionCharts课程,所以我们决定做一个彻底的研究FusionCharts ...