进行数字设计时,经常会遇到特殊的情况,Verilog 中的任务和函数已经不能满足仿真需求,需要自定义一些系统任务和函数。编程语言接口(PLI, Program Language Interface)提供了一套接口子程序,用于访问设计内部的数据结构,并可以提取仿真环境信息。用户可以调用这些子程序,自定义系统任务和系统函数,与设计内部数据以及 Verilog 仿真器环境进行交互。
通俗来讲,Verilog PLI 提供了一套 C 语言函数, 设计人员可以调用这些集成函数编写软件 C 程序。RTL 编译时,将编写的软件程序也集成到仿真环境中。仿真运行时,通过系统任务调用的方式,就可以动态的去访问仿真中的数据结构。这种访问是双向的,不仅可以从仿真器的数据结构中读取信息, 还能修改数据结构的信息。
PLI 的功能是十分强大的,其用途只局限于设计人员的想象力。
这里总结下 PLI 经常使用的功能:
PLI 的发展主要经历了 3 代。
1985-TF 接口
第一代被称为任务/函数(Task/Function)接口,简称 TF 接口。TF 接口包含一套 C 语言函数库,均以 tf_ 为前缀,定义在 veriuser.h 中。这些 C 函数一般称为 TF 子程序,主要包括用户自定义任务和函数、实用函数、回调机制和数据写输出。
1989-ACC 接口
第二代被称为存取(Access)接口,简称 ACC 接口。ACC 接口中的函数均以 acc_ 为前缀,定义在 acc_user.h 中。ACC 子程序主要用于访问和修改 Verilog 描述的多种对象。ACC 库函数是 TF 库函数的叠加,而非替换。
一般 PLI 接口特指是 TF 和 ACC 接口。
1995-VPI 接口
第三代被称为过程接口(Verilog Process Interface),简称 VPI 接口。VPI 子程序是 TF 和 ACC 子程序功能的合集,定义在 vpi_user.h 中。
相对于 PLI 子程序又多又乱,VPI 尤显精炼。由于 PLI 诞生之初,没有统一的标准,完全是在实践中发展,导致常用的 PLI 库函数有近百个,写程序时基本都要查手册。
而 VPI 是根据一定的标准统筹规划制定的,融入了很多面向对象的思想,库函数精简度远超 PLI。但是 VPI 结构比较复杂,不容易上手。VPI 最大的弱点还是对仿真器的支持并不友好。
2003-SystemVerilog 与 DPI
作为 Verilog 的扩展,2003 年 SystemVerilog 标准发布,支持更多形式的仿真。
DPI 接口(Direct Procee Interface)成为软件与 SystemVerilog 交互的接口,目前占主流。
一般情况下,使用 PLI 的 TF 和 ACC 接口就能满足仿真需求了。本章只对 TF 和 ACC 接口进行简单介绍。其他接口待那个少年学成之日,再一一分享给大家。
通过编写系统任务和系统函数, 用户能够用 PLI 和 C 程序扩展 Verilog 语言。这些用户定义的系统任务和函数的名称必须以美元符号 "$" 开头。此时 Verilog 里面的任务相当于一个子程序。当调用任务时,仿真器的执行流程跳转到子程序,完成任务后执行流程返回。Verilog 任务并不返回数值,但是可以有输入、输出和双向的形参。
Verilog 里面的函数跟大多数语言里面的函数一样。 当调用函数时,它运行一套指令,然后返回一个数值给调用它的指令。
PLI 流程
使用 PLI 接口完成用户自定义系统任务的基本流程如下所示。

下面以简单的系统任务 $hello_runoob 为例进行说明。该系统任务被调用时,会输出一行字符串 "Hello Runoob!"。
PLI 编写系统任务
用 C 语言描述的打印程序如下所示,文件命名为 hello_runoob.c 。
为说明 PLI 使用的一般流程,此程序并没有调用 TF/ACC 子程序。
#include "stdio.h" //不包含 PLI 库子程序
int hello_runoob(){
printf("Hello Runoob! \n");
}
PLI 连接仿真器
以 VCS 使用为例,编译或创建 VCS 编译时需要的与 C 相关的文件。
对上述 hello_runoob.c 进行简单的编译,输出 hello_runoob.o 文件。注意相对路径。
gcc -c ../tb/hello_runoob.c
创建 VCS 可识别的链接 table 文件,文件命名为 hello_runoob.tab, 内容如下。
$hello_runoob call=hello_runoob
Verilog 调用系统任务
在 Verilog 中以系统任务调用的方式调用 $hello_runoob,描述如下。
`timescale 1ns/1ps
module test ;
initial begin
#10 ;
$hello_runoob;
end
initial begin
forever begin
#100;
if ($time >= 10000) $finish ;
end
end
endmodule
Verilog 编译仿真
对 RTL 和 编写的 PLI 中间文件进行编译。表明要链接 PLI 库中的表文件时,需要用 "-P" 参数指定。例如该仿真中应该在 VCS 命令行中增加如下参数(注意相对路径):
-P ../tb/hello_runoob.tab hello_runoob.o
仿真结果中可以看到打印的信息,截图如下。

Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA
介绍pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等测试用例的skip和xfail处理可以很好的和jenkins集成
📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战
文章目录一,什么是kaliPurle(卡利紫)二,如何安装kaliPurple。(有步骤没图片直接是默认)1,复制它的下载链接到迅雷可以让你下镜像变得更快。2,打开你的虚拟机创建新的虚拟机3,点击后面浏览然后找到镜像的所在地选中确定,下一步4,这里默认就可以,因为Ubuntu和这个差不多架构。5,然后,名字自己改一下,然后把他安到你想要装的盘,容量默认。之后一直下一步就可以**6,打开它,然后第一个图形界面安装,直接回车,然后选中文点continue之后没有图片的直接点继续。7,密码想设什么设什么。然后一直继续到我的图片那里改一下就可以了。8,软件默认就行。9,耐心等待。然后点手动配置dvc然
目录关于MPU6050芯片关于小板关于厂家和DATASHEET关于漂移关于角加速度还是角速度关于精度和量程(可调,可选)关于功耗,陀螺仪+加速器工作电流:3.8mA(全功率,陀螺仪在所有速率下,在1kHz采样率下加速)采样率高,功耗也高可以参考 MPU6050陀螺仪与Processing和匿名上位机飞控联动实录-知乎关于MPU6050芯片MPU6050传感器模块是6轴运动跟踪设备。包含3轴陀螺仪、3轴加速度计、运动处理器、温度传感器。I2C总线接口,可与微控制器进行通信。通过辅助I2C总线与其他传感器设备通信,如3轴磁力计、压力传感器等。如果3轴磁力计连接到辅助I2C总线,则MPU6050可
MySQL为您提供了一个有用的字符串函数REPLACE(),它允许您用新的字符串替换表的列中的字符串。REPLACE()函数的语法如下:REPLACE(str,old_string,new_string);SQLREPLACE()函数有三个参数,它将string中的old_string替换为new_string字符串。注意:有一个也叫作REPLACE的语句用于插入或更新数据。所以不要将REPLACE语句与这里的REPLACE字符串函数混淆。REPLACE()函数非常方便搜索和替换表中的文本,例如更新过时的URL,纠正拼写错误等。在UPDATE语句中使用REPLACE函数的语法如下:UPDATE
我正在做这样的事情,其中MyConfig是一个aspx页面。winOpen=window.open('/Account/Register','MyConfig','toolbar=no,status=no,location=no,menubar=0,resizable=yes,scrollbars=yes,width='+wWidth+',height='+wHeight+',top='+wTop+',left='+wLeft);winOpen.focus();它返回null。它在chrome+WIndows8.1预览版中工作正常,但在IE11中不工作。编辑我在问题中又添加了一行,
有谁知道Netbeans8.1是否支持es6javascript语法,我该如何启用它? 最佳答案 不,它在8.2中,NetBeans8.2候选发布版位于https://netbeans.org/downloads/8.2/rc/ 关于Netbeans8.1上的Javascriptes6语法支持,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/39489996/
SM4为分组对称密码算法,明文、密文以及密钥长度均为128128128bits。SM4算法主要包括加解密算法和密钥扩展算法,采用323232轮非线性迭代的数学结构,其中算法中每一次迭代运算为一轮非线性变换。主要操作包括异或、合成置换、非线性迭代、反序变换、循环移位以及S盒变换等。加密算法和解密算法的数学架构、运算法则、运算操作等都是完全相同的,解密运算只需要将加密算法中生成的轮密钥进行反序使用。其流程图如下图所示。图1.SM4密码算法加密流程图密钥扩展算法 设加密主密钥MK=(MK0,MK1,MK2,MK3)MK=(MK_0,MK_1,MK_2,MK_3)MK=(MK0,MK1,MK