引言

在进行IC验证时,尤其是规模较大的时候,单纯用Verilog和SV来构建testbench。可能会稍显吃力。

在这样的情况下,使用C或者C++等软件语言往往会大大加快验证速度,提高验证效率。

PLI,VPI,DPI正是基于这个原因开发的,非常多仿真器都会提供支持。

之前,我们介绍过VPI的使用。本小结就来说一下更易使用的DPI。

1,基本功能

还是惯例,通过一个详细的实验来体会DPI的使用。

环境:IUS820(Ncsim)。

我们将使用C语言来分别实现一个加法器和一个乘法器。

当中加法器以task的形式实现,乘法器以function的形式实现。

须要注意的是,在实际的项目开发中。我们一般不建议在verilog或SV中直接调用用C语言实现的函数或者task,建议加一个verilog或者SV的wrapper,做一个隔离。利于维护和更新。

2,testbench

/*
* tb.v
* dpi test
* Rill
* 2014-09-28
*/ module tb; reg clk;
reg rst_n; reg enable;
reg [7:0] a;
reg [7:0] b;
wire [31:0] sum; reg [7:0] c;
reg [7:0] d;
reg [31:0] mul_cd; `include "mul.v" add add0
(
.clk (clk),
.rst_n (rst_n),
.enable (enable),
.a (a),
.b (b),
.sum (sum)
); always #1 clk = ~clk; integer loop; initial
begin
clk = 0;
rst_n = 0;
enable = 0; repeat(10) @(posedge clk);
rst_n = 1; repeat(10) @(posedge clk);
enable = 1;
for (loop=0;loop<10;loop=loop+1)
begin
@(posedge clk);
a = loop;
b = loop+1;
end repeat(3) @(posedge clk); @(posedge clk);
c = 2;
d = 2;
mul_cd = mul_dpi(c,d); $display("%dx%d=%d",c,d,mul_cd); $finish;
end endmodule

3,add.v

/*
* add.v
* dpi test (wraper)
* Rill
* 2014-09-28
*/ module add
(
input clk,
input rst_n,
input enable,
input [7:0] a,
input [7:0] b,
output [31:0] sum
); import "DPI-C" task add_dpi(
input int a,
input int b,
output int sum
); reg [31:0] sum_r; assign sum = sum_r; always @(posedge clk)
begin
if(~rst_n)
sum_r <= 32'b0;
else if(enable)
add_dpi(a,b,sum_r);
end endmodule

4。add_dpi.c

/*
* add_dpi.c
* dpi test
* Rill
* 2014-09-28
*/ #include <stdio.h> int add_dpi(int a,int b,int* sum)
{
*sum = a + b;
printf("C_code: %d+%d=%d\n",a,b,*sum);
return 0;
}

5,mul.v

/*
* mul.v
* dpi test (wraper)
* Rill
* 2014-09-28
*/ import "DPI-C" function int mul_dpi(
input int c,
input int d
); function [31:0] mul;
input [7:0] c;
input [7:0] d; mul=mul_dpi(c,d); endfunction //

6,mul_dpi.c

/*
* mul_dpi.c
* dpi test
* Rill
* 2014-09-28
*/ #include <stdio.h> int mul_dpi(int c,int d)
{
return (c * d);
}

7,脚本

#! /bin/bash

#
# dpi.sh
# usage: ./dpi.sh c/w/r
# Rill create 2014-09-03
# 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 lib..."
ncvlog -f ./vflist -sv -update -LINEDEBUG;
ncelab -delay_mode zero -access +rwc -timescale 1ns/10ps ${TOP_MODULE} echo "compile DPI lib..."
gcc -fPIC -shared -o libdpi.so add_dpi.c mul_dpi.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!"

8,vflist

//vflist
tb.v
add.v

9,验证结果

10,小结

相对于VCS,Ncsim对DPI的支持略微弱一点。可是从上面的实验能够看出。主要的功能都是支持的,上面的实验尽管简单,但已经包括了实际项目中的大部分情况。

enjoy!

11,參考文献

Ncsim安装路径下的dpiEnrNbk.pdf及其演示样例代码,

我已上传:

http://download.csdn.net/detail/rill_zhen/7990949

数字集成电路设计-14-DPI的更多相关文章

  1. 数字集成电路设计-8-一个简单sobel图像边缘检测加速器的设计,实现,仿真与综合

    引言 图像视频处理等多媒体领域是FPGA应用的最主要的方面之一,边缘检测是图像处理和计算机视觉中的基本问题,所以也是最常用的,随着数据量的不断增加以及对实时性的要求,一般软件已经不能满足实际需要,这时 ...

  2. 13.SpringMVC和Spring集成(一) && 14.SpringMVC和Spring集成(二)

    1.概念 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,Spring致力于J2EE应用的各层的解决方案,Spring是企业应用开发的“一站式”选择,并贯 ...

  3. python数字图像处理(14):高级滤波

    本文提供更多更强大的滤波方法,这些方法放在filters.rank子模块内. 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定. 1.autolevel 这个词在 ...

  4. Spring4.2 集成ActiveMQ5.14

    1:libs 2:web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

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

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

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

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

  7. 数字IC前后端设计中的时序收敛(六)--Max Fanout违反

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

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

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

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

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

随机推荐

  1. JS性能优化之创建文档碎片(document.createDocumentFragment)

    讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么.         在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面就会更新并反映出这个变化,对于少量的更新, ...

  2. Easyui 判断某个Div 里的表单项是否验证通过.

    var isValid = $("#divId").Form("validate"); if( isValid ){ alert("验证通过" ...

  3. [Python爬虫] 之五:Selenium 处理滚动条

     selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的.这时候需要借助滚动条来拖 ...

  4. (转)scala中map与flatMap浅析

    在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好 ...

  5. 飘逸的python - 不使用keyword,求和1+2+…+n

    依据题意,我们不能用到if/else/for/while等keyword. --------------思考中------------ 思路: 1.用递归实现循环 2.递归的终止条件不用if怎么推断呢 ...

  6. C++标准库简介

    C++标准库的所有头文件都没有扩展名.C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能. <cname>形式的标准头文件[ <complex>例外]其 ...

  7. leetCode 86.Partition List(分区链表) 解题思路和方法

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  8. PL/SQL 之 基础

    PL/SQL(Procedural Language extensions to SQL)是Oracle 对标准 SQL 语言的过程化扩展,是专门用于各种环境下对 Oracle 数据库进行访问和开发的 ...

  9. TP框架中session操作

    TP中session操作 查看代码,OMG! 不应该是这样的

  10. ACE-Streams架构简介及应用

    一概述 Streams框架是管道和过滤构架模式的一种实现,主要应用于处理数据流的系统.其实现以Task框架为基础.Task框架有两个特性非常适用于Streams框架:一是Task框架可用于创建独立线程 ...