自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (2)
  • 收藏
  • 关注

原创 Verilog设计,找到第一个1的位置

输入一个多bit的数,找到第一个1的位置。

2023-08-14 17:01:07 1570

原创 Spyglass使用教程——实验四

在本练习中,我们将分析lint目标运行期间产生的违规。我们可以在SpyGlass GUI中使用各种调试工具来理解违规,在RTL代码中调试其根本原因,并查看如何在SpyGlass环境本身中修复这些违规。同时在运行Goal**同时会生成多个报告,不同报告提供不同信息,可在Report》More Report下查看。在GUI底部的Violations可查看违规信息。在显示出违规信息后,点击违规信息窗口顶部的Group By,然后选择Goal by Rule。此字段确定批处理运行中的违规在消息树中的排序方式。

2022-11-19 17:02:24 1863 1

原创 Spyglass使用教程——实验三

其中Run Status显示目标是否运行,如果运行会有生成了多少错误、警告和信息消息。注意有的Goal的运行要求使用额外的SpyGlass组件。参考:https://blog.csdn.net/qq_30843953/article/details/109629618。至此,通过该实验知道了如何运行Goal及如何查看报告信息。本实验在实验二的基础上进行目标设置和结果检查。

2022-11-19 16:13:02 803

原创 Spyglass使用教程——实验二

​ 要预编译一个HDL库,您必须指定要在逻辑库中预编译的文件列表,以及逻辑库名称和物理目录之间的映射。这是使用lib_hdlfiles(定义要编译到命名库的文件)和lib(将命名库映射到物理目录)选项完成的(添加到**.prj文件的##Data Import Section**部分)这些单元格很可能是使用-y/-v选项传递的,所以让我们浏览一下“usb”中的目录,看看是否有任何丢失的库文件。​ 通过上面的文件添加和设置消除了之前的黑盒问题,但因为新的文件加载也引入新的黑盒问题,如下所示。

2022-11-19 15:38:33 2238

原创 Spyglass使用教程——实验一

之后点击“Read Design”,再在左侧点击“Run Design Read”开始进行设计文件编译和分析,在读取完成后会在下方窗口列出问题。如果需要修改代码,可以在代码窗口中点击有问题的代码行,使得光标落于该行,然后点击e即可将打开默认的编辑器进行代码编辑。错误信息以红色显示,警告以橙色显示,信息以绿色显示。在窗口上方中间点击Goal Setup ,然后在主窗口区勾选Lint_rtl(在lint中点击+即可见),如下图。左侧选择文件后点击中间的“Add”即可完成文件的添加,点击“OK”退出当前窗口。

2022-11-19 14:36:50 4361

原创 UVM信息服务机制

信息打印机制,比$display具有更好的优势。

2022-07-07 10:17:05 121

原创 UVM事务级建模

1、用户定义的transaction类,必须要扩展于uvm_sequence_item2、需要为transaction的成员指定rand属性,这样可以产生随机激励。note:rand属性不是必须的

2022-07-06 20:45:04 113

原创 UVM之sequence机制

定义:控制和产生一系列的事务,并将事务发送给driver的一套机制。(一系列动作的集合)例子:driver向sequencer发送事务请求,sequencer再向其关联的sequence发送请求,sequence接收到请求之后,立即将已经生成好的事务发送出去。发送出去的事务通过sequencer之后再转发给请求事务的对象。请求该事务的对象处理完事务之后,发送处理完事务的响应,再以sequencer为中介,转发到sequence。接着sequence将产生下一个事务,等待下一次事务请求。优点:将事务的

2022-07-06 15:31:30 576

原创 uvm-phase机制

uvm中的phase有耗时和不耗时两种类型。下图中灰色部分为耗时的类型,task;白色部分为不耗时的类型,function。不耗时的 build_phase,这个 phase 主要用来实例化各个组件环境,理论上为了 uvm_tree 的顺利构建应该从上往下执行。如下图,不耗时的phase从树顶到数叶自上而下执行,构建整个验证环境。不同层次所有组件的 build_phase() 从空间(uvm-tree)上从上而下执行从树根到树叶的全部组件类 build_phase(),而同层次的组件类则是按照 ne

2022-07-06 11:24:28 576

原创 UVM——field automation机制

filed automation机制UVM field automation机制是为了方便用户对事物进行打印、复制、打包、解压、比较、记录等一些列功能而建立的一套服务机制,即使用UVM内建的函数对事务进行处理。要使用UVM field automation机制,在事务中对数据使用`uvm_field_*进行注册,例如class my_transaction extends uvm_sequence_item; rand bit [3:0] sa; rand bit [3:0] da;

2022-02-16 12:40:12 741

原创 UVM——sequence library

sequence library本质是一个sequence,包含了一组在其内部注册了的sequence类型,可通过对其进行配置,创建并执行一系列的sequence、sequence_item。向sequence library永久注册sequence首先创建sequence library类class my_sequence_lib extends uvm_sequence_library #(my_transaction); `uvm_object_utils(my_sequence_l

2022-02-15 22:03:56 1022

原创 UVM——Callback

步骤1、将UVM Callback方法内嵌入组件中。2、创建一个最基本的UVM Callback类以供扩展。3、从上一步所创建的类中扩展出所需的Callback类。4、在顶层实例化并注册Callback对象。代码示例步骤1,首先,在driver中关联实现Callback方法的类(最基本的UVM Callback类)。class my_driver extends uvm_driver #(my_transaction); `uvm_component_utils(my_driver)

2022-02-15 13:26:23 494

原创 UVM——普通TLM端口的用法

put模式producer调用consumer中重载的put方法,把数据发送到consumer。代码示例如下。此处的代码示例为monitor向reference model发送数据。monitorclass my_monitor extends uvm_monitor; `uvm_component_utils(my_monitor); virtual dut_interface m_vif; uvm_blocking_put_port #(my_transaction

2022-02-14 23:04:07 303

原创 UVM——configuration机制

这里使用三个示例具体介绍uvm_config_db的用法配置sequence产生transaction的数量1、添加控制变量item_num2、使用get()获取控制变量item_num的配置获取:class my_sequence extends uvm_sequence #(my_transaction_da3); `uvm_object_utils(my_sequence) int item_num = 10; function new(string name

2022-02-14 20:04:13 512

原创 UVM factory机制

factory机制的运作步骤1、将用户自定义的类向factory的注册表中进行注册。2、要使用“class_name::type_id::create()"来代替new实例化对象。3、根据具体要求向替换表添加替换条目。4、在运行仿真时,UVM会根据这两张表自动实现factory机制。factory机制的使用1、使用`uvm_object_utils()对uvm_object类进行注册。2、使用`uvm_component_utils()对uvm_component类进行注册。3、使用“cla

2022-02-14 15:43:34 490

原创 UVM学习——UVM phase的objection属性

UVM Objection作用1、控制taskphase的运行和终止2、同步各个component同名的task phase代码示例示例一在上一篇博客的基础上对driver的代码进行修改,之后运行仿真。class my_driver extends uvm_driver #(my_transaction); `uvm_component_utils(my_driver) function new(string name = "my_driver", uvm_componen

2022-02-14 11:15:51 340

原创 UVM学习——构建一个简单的UVM验证平台

构建一个简单的UVM验证平台本次构建的验证平台不包含DUT。创建transaction和sequencetransaction代码如下:class my_transaction extends uvm_sequence_item; rand bit [4:0] sa; rand bit [3:0] da; rand reg [7:0] payload[$]; //定义数据成员 `uvm_object_utils_begin(my_transaction)

2022-02-13 22:25:45 1867

原创 GVIM编辑技巧

:sv/sp,切屏,方便两个文件的对比。:q退出:E显示当前目录下文件,可移动光标选择需要打开的文件Ctrl+q,往下移动光标,选中一列,输入大写的i,输入字符,之后按esc,可在该列前插入一列字符。选中包含多列内容的块之后可以用Ctrl+q得到多列的内容,之后可进行复制等操作。:%s/input/reg /gc把input替换成reg,gc表示在替换的时候要确认23,46s/ input/reg /gc 限定替换的行范围dd删除光标所在行,dnd删除n行p粘贴yy复制光标所在行,dnd复

2022-01-25 23:08:55 1688

原创 Synopsys system veriolog Lab学习(5)

Lab5前面四个实验理解起来相对容易一些,Lab5相对难一些。该实验把测试平台的每个组件都封装为一个类,要考虑每个组件之间的通信,还要控制互斥资源的访问(本实验中为不同驱动器驱动数据通过router时,多个数据包对同一输出端口的竞争)。本实验需要封装的类如下图所示,类之间的通信通过信箱实现。测试平台框架如下图所示,在测试平台中,各个组件是同时开始工作的。该框架和Lab4的区别之一是具有多个驱动器和接收器,同时驱动数据和接收数据。Generator在该类中,通过start()任务产生数据包。

2022-01-23 11:05:17 634

原创 Synopsys system veriolog Lab学习(4)

Lab4该实验在Lab3的基础上,把数据包封装起来,即把数据封装到一个类中。class Packet; //Lab 4 - Task 2, Step 4 // //In the body of the class create the following properties //rand bit[3:0] sa, da; //rand logic[7:0] payload[$]; // string name; //ToDo rand bit[3:0] sa,

2022-01-22 23:18:30 1682

原创 Synopsys system veriolog Lab学习(3)

Lab3该实验在Lab2的基础上增加了Monitor和checker,检测接口输出的数据包和验证和发送的数据一致。测试平台框图如下:捕获接口输出数据的任务定义如下: //Lab 3 - Task 3, Step 3 // //Declare the get_payload() task //ToDo task get_payload(); //Lab 3 - Task 3, Step 4 // //In get_payload() delete cont

2022-01-22 22:52:01 276

原创 Synopsys system veriolog Lab学习(2)

Lab2该实验在Lab1的基础上在test中增加发数据包的任务。改动主要在Test部分代码。具体如下:program automatic test(router_io.TB rtr_io); //Lab 2 - Task 2, Step 2 // //Declare the program global variables sa, da and payload //ToDo bit[3:0] sa; bit[3:0] da; logic[7:0] payload[$];

2022-01-21 12:22:22 359

原创 Synopsys system veriolog Lab学习(1)

这里写自定义目录标题Lab1测试平台总体框图DUTInterfaceTestTB_TOPLab1该实验创建一个测试平台对DUT进行复位的测试测试平台总体框图DUTDUT为一个16输入,16输出的路由器,这个路由器的功能是把数据通过各个输入端(Input)发送到任意输出端(Output)。代码如下:module router( reset_n, clock, frame_n, valid_n, din, dout, busy_n, valido_n, frameo_n);input

2022-01-20 17:00:44 439

原创 valid/ready握手协议之ready打拍

协议实现相信网上已经有很多文章对valid/ready的原理与应用等进行了很详细的描述,这里就不再赘述,直接上代码:module frs #(parameter DW='d256)( input [DW-1:0] m_data , input m_valid , output m_ready , output reg [DW-1:0] s_data , output reg

2021-11-30 21:21:41 1532

原创 Formality使用总结1

formality流程总结1@TOC一、图形界面启动方式在命令行输入formality,接着可以看到如下界面以下1~6为进行formality的流程0、Guid在这一步导入DC综合产生的.svf文件,该文件记录了DC在综合时对设计所作的优化。然后底下log一栏返回“1”表示加载成功。1、Ref这一步是加载你的设计文件,RTL代码及IP等。可以看到有三个步骤需要执行,分别为1)Read Design File2) Read DB Libraries3) Set Top Desig

2021-11-22 19:12:05 4455 1

原创 ZYNQ 或ZYNQ Ultrascale PS/PL交互

1、在PYNQ框架下,PS/PL 交互可以用MMIO这个PYNQ类。如该处的例子https://blog.csdn.net/qq_35290955/article/details/1076719302、在SDK中,可以用xil_io.h这个头文件的IO读写函数。如该处的例子https://blog.csdn.net/narutoinspire/article/details/79401559?utm_medium=distribute.pc_relevant.none-task-blog-title-2&

2020-11-05 23:08:54 7415

UVM实战(1)+代码

UVM基础学习,从一个简单测试平台的实验到逐渐完善的测试平台的一系列实验。

2022-02-16

哈夫曼序列检测器

选择Basys2/3/Nexys4开发板,设计一个哈弗曼编码序列检测器,并完成其综合。 (1) 被检测序列为EE 0F B7 93 49 DF E3 B4 DD F4 4C EE 0F B7 91(16进制),序列可以预先固化在ROM中。 例:两个字节0x01和0x11会被编码成序列0b001100 哈弗曼编码的作用是对数据进行压缩处理,哈弗曼编码有一个特点是:如果它和它前面的码字位数相同,则当前码字为它前面的码字加1;如它的位数比它前面的码字位数大,则当前码字为前一个码字加1再补若干0,直至满足位数长度。被检测序列所涉及的哈弗曼编码,在上面的表格中都已经给出,该实验的目的就是判断序列中的码字,确定被编码的字节。例如序列中的EE 0F…二进制表示为111011 100 00 01 111…,解码出的字节为0x41、0x03、0x01、0x02; (3)检测上面序列中字节0x01的个数,并将其个数在7段数码管上显示。

2019-09-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除