c++ gdi修改dpi_SV DPI-C接口学习心得

2023-05-16

1、是什么??

DPI(Direct Programming Interface),全称直接编程接口,是SV与其它语言(C/C++)交互的接口,基本上是唯一接口了。

2、为什么??

说完是什么,那么我们可以考虑一下了,为什么需要这个接口呢?或者说为什么SV/UVM需要与其它语言产生交互呢?

其实就是SV和C之间的一种转换关系。

这就涉及到了一些应用场景,我们可以说几个看看。

(1)我们知道,在模块级乃至子系统级的验证,使用SV就完全够用了,而在更上面的层级,例如系统级,多采用大量的C代码组成。那么为了完成测试用例从子系统到系统级的复用,我们最好在子系统级开始就有意识地建立支持C测试的环境,并且使用一些基于C的测试用例,这样才能使得整体具有更好的复用性。

(2)处理器的需要。子系统测试时,不一定本身自带了处理器的硬件实例(Verilog编写的),因此在构建子系统时还要考虑如何模拟外部处理器对子系统的访问行为。

当然,我们直接加上一个外部的处理器实例是完全可以的,等验证完子系统的功能后再撤掉就行。注意,这个处理器实例也是verilog编写的。

但是,这种方法也存在了一些弊端:即使这个外部处理器再小巧,但硬件体积还是过大了,肯定会影响整个仿真的速度;针对不同子系统的预留接口(APB/AHB/AXI等),处理器子系统也要进行对应的调整吧;这种真实的处理器,必然要处理C代码,所以要进行编译、转换成二进制bin文件以及下载到memory中,还是太麻烦;还需要额外的启动配置文件,而且仿真时需要额外的额时间进行初始化。

总结一下真实处理器的弊端,那就是麻烦,处理C代码也繁琐,影响了仿真速度。

既然这样,必然引出了解决办法。

刚刚说到,硬件的体积大、速度慢,那么转换成软件如何?这样既能保证复用,又可以模拟一些常规处理器的行为。

可以考虑一下,既然要实现这些,我们就要考虑一下处理器的功能了:支持各种总线接口的读写;支持中断响应;支持时间等待;支持多核并行处理;支持系统复位;支持上电和掉电行为。

那么这样一个软件环境,可以用SV来搭建,既然还要处理一下C语言,所以也必然需要DPI-C接口,这就是第二种场景。

3、怎么做??

说完了应用场景,该说说怎么实现了。

此时,我们要明白两个问题:SV和C之间的数据类型不是完全一致的,所以肯定需要转换;SV和C之间的控制信号又该如何传递呢?

给个简单例子吧,先看为敬。

import “DPI-C” function int factorial(input int i);
 
program automatic test;
 initial beign
  for(int i=1;i<=10;i++)
  $display(“%0d != %0d”, i, factorial(i));
 end
endprogram

好,我们看出来了,这是SV一侧导入C方法的示例,需要用import,后面的function是表示了这个导入到SV一侧的C方法在这一侧的名称及类型。

通常,带返回值的C函数会被映射成一个SV函数;void类型的C函数会被映射成一个SV任务或者void函数。

那么,如果我想在导入的同时修改一下姓名呢?

Import “DPI-C” test = function void my_test();

参数方向

对于参数方向,支持input, output以及inout。Ref则不被支持。

当然默认是input类型。

Import “DPI-C” function int addmul(input int a, b, output int sum);

数据映射关系

这个就很重要了,表示了SV和C交互时的数据类型转换关系。

另外需要提醒一下,C中本身是不具有这些交互类型的,需要在使用前添加头文件

#include <svdpi.h>才可以

乍一看很复杂

那么我们举一个例子来看看

首先是C语言一侧

#include 

下面是SV一侧的方法

import 

下面一些具体方法就不写了,我们注意到,bit[N:0]与bit还是不一样的,还有一点可以注意一下,即使是bit[0:0]与bit,虽然在SV一侧是相同的(假定都是输入),但是到了C一侧,它们的类型分别是const svBitVecVal*与svBit。

SV中也能直接应用C的一些数学函数,这一点还是很方便的。

import “DPI-C” function read sin(input real r);

四值逻辑变量的转换关系

上面的看起来都比较常规,接下来这个就有意思了。我们知道,C语言是软件环境,所以只会有0和1,那么它怎么才能表示诸如logic等四值变量呢??

这个很巧妙,假设SV一侧有一个logic f,那么它在C一侧,会用一个无符号的字节来保存。分为aval和bval,其中aval保存在最低位,bval保存在紧邻的高位。

下面给出转换表

四状态值bvalaval
000
101
Z10
X11

两位表示一位,所以1’b0在C中就是0x0,1’b1在C中是0x1,1’bz在C中是0x2,1’bx在C中是0x3。

那么logic[31:0] lword,就更有意思了,我们采用一对32bit的变量来表示,第一个aval[31:0]包含低32位的数值,bval[31:0]包含了紧邻高位的数值,表示如下:

所以在导入数组时,需要同时赋值aval和bval,例如data[31:0],例如要将data[0]=1,那么需要data[0].aval=1, data[0].bval=0;

此时要说明一下,在导入方式上,

import “DPI-C” context task core0_thread();

这个关键词表示的是关联导入,其实分为三种导入方法,pure、context以及generic。

如果一个函数严格根据输入来计算输出,跟外部环境没有其它交互,那么就是pure的;如果使用了全局变量,那它就不会是pure方法了,但如果它也没有调用任何的PLI,所以其实也不必声明为context(因为关联类型会导致额外的开销),所以可以声明为generic(缺省下为此类型)。

从SV中导出

这个就比较简单了

export 

注意后面不需要加括号和参数,如果需要改变名字,则可以

export “DPI-C” dpi_writew = task writew;

而在C一侧,则只需要extern void sv_display();就可以了

当然有参数还是要加的

extern void dpi_writew(unsigned int addr, unsigned int data);
extern void dpi_readw(unsigned int addr, unsigned int *data);

好了,最基本的就是这些了,具体的以后再说。

自我总结。

———————————————————大量引用了SV的绿皮书以及芯片验证漫游指南

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ gdi修改dpi_SV DPI-C接口学习心得 的相关文章

  • 测量缠绕的绳子

    我正在尝试创建一个控件 它基本上允许我在彼此下面绘制不同的字符串 但是 字符串的宽度不能大于控件的宽度 为了解决这个问题 我正在考虑将 RectangleF 对象传递给 Graphics DrawString 方法 这将包装比传递的矩形宽度
  • 在 C# 中旋转色调

    我正在寻找复制发现的 CSS3 色调旋转行为here http css3 bradshawenterprises com filters 原始图像 色调旋转 180 度的图像 我已经可以准确地将 RGB 值转换为 HSL 值 然后再转换回来
  • 通过 C# Graphics 绘制“透明”文本,但在某种程度上它将绘制的文本变为“缺失”,因此它在结果图像中是透明的

    我希望在 DC 上绘制一个字符串 图形 我正在使用 C 但我希望将绘制的文本从图像中 删除 以便剩下的本质上是文本的剪切 如果我用透明画笔绘制绳索 显然什么都不会发生 有没有一种方法可以绘制类似的东西 或者我是否需要使用 2 个 DC 和
  • 如何用颜色填充位图对象中的封闭区域

    给区域内的点赋予颜色来填充区域 类似于油漆桶功能中的 绘图 这 NET Framework 中 没有直接的等效项 但我希望使用 C 来做到这一点 是否可以 这是一个非常简单的洪水填充算法 应该可以帮助您入门 void Form1 Paint
  • 在 .NET 中组合多个 PNG8 图像的最简单方法

    我正在尝试在 C 中将一堆 8 位 PNG 图像组合成一个更大的 PNG 图像 奇怪的是 这似乎特别困难 由于图形不支持索引颜色 因此您不能使用它 因此我尝试构建非索引位图 使用图形 并将其转换为索引颜色位图 转换很好 但我不知道如何设置输
  • Delphi/GDI+:设备上下文何时创建/销毁?

    通常在 Delphi 中使用 GDI 你可以使用绘画盒 并在期间进行绘画OnPaint event procedure TForm1 PaintBox1Paint Sender TObject var g TGPGraphics begin
  • 如何使用计时器对图像应用淡入淡出过渡效果?

    我正在尝试在两个 PictureBox 控件之间进行淡入淡出过渡 我使用计时器来更改两个 PictureBox 的不透明度GetPixel and SetPixel每当时间流逝 在这个阶段 问题是这段代码引发了异常 System Inval
  • 如何绘制独立于 DPI 的 GDI + 文本

    我正在使用 GDI 绘制文本 我最近注意到 当 DPI 更改时 该文本会自动缩放 有没有办法让GDI 文本绘制独立于DPI 例如 我想绘制最大 20 像素的文本 无论 DPI 是多少 是否可以 这个怎么做 下面是示例代码 我想以恒定的大小绘
  • 我可以在不更改系统 DPI 设置的情况下设置 Java Swing 应用程序的 DPI 分辨率吗?

    我有一个使用 Substance LookAndFeel 并以 Windows 作为目标平台的 Java 应用程序 我想增加应用程序的 DPI 设置without更改系统设置 我想这样做是因为我不想强迫用户重新启动 Windows 而且许多
  • 在 GDI+ 中调整大小时出现幽灵边框(“响铃”)

    发生的情况 仅在某些图像上明显 是我会看到一个 1 像素白色边框 该边框插入一个像素 它似乎发生在明亮但不白色的区域 例如天空 这类似于某些东西过度锐化并且在高对比度边缘旁边可以看到重影边界 这是完美重现它的重现代码 我正在使用所有最高质量
  • Winforms:SuspendLayout/ResumeLayout 还不够?

    我有一个包含一些 自定义控件 的库 本质上 我们有自己的按钮 圆角面板和一些带有一些自定义油漆的分组框 尽管 OnPaint 方法中存在 数学 但控件还是相当标准的 大多数时候 我们所做的只是绘制圆角并向背景添加渐变 我们使用 GDI 来实
  • 如何重叠两个控件

    我有一个圆和一个线控件 Circle 控件的 OnPaint 绘制一个圆 Line 控件的 OnPaint 绘制一条线 这两个控件包含在另一个控件 DrawingControl 中 我需要在圆上放置一条线 但圆的背景删除了该线 我尝试启用透
  • GDI+ 性能技巧 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何判断一个点是否属于某条线?

    如何判断一个点是否属于某条线 如果可能的话 示例值得赞赏 在最简单的形式中 只需将坐标代入直线方程并检查是否相等 Given Point p X 4 Y 5 Line l Slope 1 YIntersect 1 代入 X 和 Y Y Sl
  • 绘制自定义 Windows 控件时出现问题

    我正在尝试使用 Windows 中的 uxTheme 库绘制自己的自定义控件 但我无法弄清楚为什么我的控件看起来不像常规 Windows 控件 据说 使用我正在使用的相同主题 上图显示了标准的 Windows ComboBox 顶部 和使用
  • 设置窗口像素的正确(且无闪烁)方法?

    我正在努力找出在 WM PAINT 期间将纯 RGBA 值数组转储到 Win32 窗口的客户区的正确方法 我有以下代码 但它看起来已经很复杂 我什至还没有完成 case WM ERASEBKGND return 1 case WM PAIN
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将
  • GDI+、JPEG 图像到 MemoryStream 中发生一般错误

    这似乎是整个网络上一个臭名昭著的错误 以至于我无法找到问题的答案 因为我的场景不适合 当我将图像保存到流中时 会引发异常 奇怪的是 这对于 png 来说效果很好 但是对于 jpg 和 gif 却给出了上述错误 这是相当令人困惑的 大多数类似
  • Windows API 中逻辑坐标和设备坐标之间的混淆

    我一直在研究一个使用两个函数的 Visual Studio C Windows 应用程序项目SetWindowExt and SetViewportExt 我对这两个函数的作用以及为什么它们是必要的感到困惑 搜索这些函数 我得出了逻辑坐标和
  • 关于 ColorMatrix 转换如何工作的说明

    我正在图像处理应用程序上做一些工作 为了好玩 并且正在努力完全理解 ColorMatrix 转换的工作原理 我了解了线性 仿射变换的基础知识 并且可以通过在线复制示例来很好地理解 但我想完全掌握why有些东西有效 而不是仅仅满足于它有效 例

随机推荐