自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 on-chip-bus(四)AXI总线:突发长度、突发大小以及非对齐传输的理解

1.突发长度、突发大小突发长度(burst length):指在一次突发传输中进行的数据传输次数,用AxLEN字段标识。由于标识值是从0开始的,实际的突发长度应为标识值+1,即突发长度=AxLEN + 1.突发大小(burst size):指突发传输中的每次数据传输的字节数,用AxSIZE字段标示。突发大小=2^AxSIZE2.非对齐传输(Unaligned Transfer) 首先需要理解地址的对齐传输:在ARM的32bit的地址总线中,其最低两位[1:0]=0,所以从第...

2021-12-24 14:07:06 17934 5

原创 UVM(六):验证环境的组成:UVM组件家族——uvm_component

1.概述 UVM的组建类(uvm_component)是验证环境的骨架,用于验证环境的结构的创建。主要包括uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_scoreboard、uvm_env、uvm_test等。在对组件类进行工厂机制的注册时,需使用宏`uvm_component_utils()。而对于组件的构建函数,其固定形式为:function new(string name, uvm_component ...

2021-11-18 20:58:06 3632

原创 questsim/modelsim 中仿真VIVADO工程的方法,以及调用Xilinx的ROM IP后,导致仿真输出为0问题的解决

这几天写了个UVM的验证环境,要用questasim来运行,而待测试的DUT是之前用VIVADO做的,就得把VIVADO中的工程移植到quetasim里,其中调用了Xilinx的ROM、RAM等IP核。 首先是移植VIVADO的工程,参考这篇文章:modelsim仿真调用xilinx IP的一种方法_拾贝壳的大男孩-CSDN博客 把所有的设计和仿真文件,以及IP核文件都添加到queastasim的工程中后,仿真,发现有一个输出的值一直是0:而在V...

2021-11-17 22:08:26 1922

原创 UVM(五):config机制的使用方法详解

1.config机制的作用 在验证环境的创建过程build_phase中,除了组件的实例化,配置(config)也必不可少。为了验证环境的复用性,通过外部的参数配置,使得环境在创建时,可以根据不同参数选择创建的组件类型、组件实例数目、组件之间的连接以及组件的运行模式等。config_db机制用于在UVM验证平台间传递参数,它们通常都是成对出现的:set用于在上层设置参数,get则用于在底层拿到这个参数。相比于重新编译来修改变量,UVM的config机制可以实现在仿真中通...

2021-11-11 22:25:21 1893

原创 RISC-CPU设计(八):地址多路器模块设计

1.地址多路器模块的作用 地址多路器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址,后4个时钟周期用于对RAM或端口的读写,该地址由指令给出。2.模块端口图 3.端口功能描述 地址的选择输出信号由时钟发生器产生的8分频信号FETCH提供。PC_ADDR为程序计数器产生的指令地址;IR_ADDR为指令寄存器输出信号OPC_IRADDRS的低13...

2021-11-04 09:06:07 360

原创 RISC-CPU设计(七):算术运算器模块(ALU)设计

1.算术运算器模块的作用 算术运算器模块根据输入的8种不同操作码(来自指令寄存器输出的最高三位)分别实现对应的加、与、异或、跳转等基本操作运算。利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。2.模块端口图 3.端口功能描述 DATA和ACCUM分别是来自累加器和数据控制器的输出,OPCODE是来自指令寄存器输出的高三位指令信号,由时钟控制模块产生的alu_clk信号控制下,实现八种指令对应的不同操作,由ALU_OUT端口...

2021-11-03 21:23:03 1679

原创 UVM(四):phase机制与objection机制

1.phase机制的作用 UVM由phase来管理验证平台的运行。这些phase统一以xxxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。main_phase是uvm_driver中预先定义好的一个任务。因此几乎可以简单地认为, 实现一个driver等于实现其main_phase。driver所做的事情几乎都在main_phase中完成。UVM中的phase,按照其是否消耗仿真时间的特性,可以分成两大类,一类是function pha...

2021-11-03 15:23:55 1374

原创 RISC-CPU设计(六):RISC-CPU的寻址方式和指令系统

1.RISC-CPU的指令系统 本设计的RISC-CPU中,每条指令的长度一律为2字节(16bit),其中最高三位用于存放指令,剩余13位用于存放地址。用于存放地址的3bit数构成的指令系统仅由8条指令组成: (1)HLT:停机操作。该操作将空一个指令周期,即8个时钟周期。 (2)SKZ:为零跳过下一条语句。该操作先判断当前ALU中的结果是否为0,若是零就跳过下一条语句,否则就继续执行。 (3)ADD:相...

2021-11-02 19:50:33 1971

原创 UVM(三):域的自动化(field automation)机制

1.field automation机制是什么? 在类的定义中,使用 `uvm_object_utils_begin(class_name) 和 `uvm_object_end 宏来实现类的factory注册。在这两个宏中间,使用 `uvm_field 系列宏注册类中的所有字段(成员变量)。类中的成员变量类型决定了要使用什么样的 `uvm_field 宏:如int型变量,使用`uvm_field_int宏;string型变量,则使用 `uvm_field_string宏等。2.fi...

2021-11-02 10:39:30 2691

原创 RISC-CPU设计(五):数据控制器模块设计

1.数据控制器模块的作用 数据控制器用于控制累加器的数据输出。由于数据总线是各种操作时传输数据的公共通道,不同情况下传送不同的内容:有时传输指令,有时传输RAM区或接口的数据。累加器的数据只有在需要往RAM区域或端口写时才允许输出,否则输出应呈高阻态。2.模块端口图​​​​​​​3.端口功能描述 任何部件往总线上输出数据时,都需要一个控制信号,而此控制信号的使能和关闭则由CPU状态控制器输出的各信号控制决定...

2021-11-02 08:41:20 453

原创 UVM(二):factory机制——工厂的作用及本质、重载(override)

1.factory机制的作用 在SystemVerilog中,我们知道,要创建一个类的实例,必须使用new()函数。而在UVM中,提供了factory机制:它可以根据类名创建这个类的一个实例;另外,还可以在创建类的实例时根据是否有重载类型来决定是创建原始的类,还是创建重载后的类的实例。 从本质上来看,factory机制其实是对SystemVerilog中new函数的重载:原始的new函数功能太过简单。经过factory机制的改良后,进行实例化的方法多了很多。2.使...

2021-11-01 14:43:30 5828 2

原创 RISC-CPU设计(四):累加器模块设计

1.累加器模块的作用 累加器用于存放当前的结果。它也是双目运算中的一个数据来源。2.模块端口图3.端口功能描述 复位后,累加器的值是0。当累加器通过ENA端口收到来自CPU状态控制器LOAD_ACC信号时,在clk上升沿触发时就收到来自数据总线的数据。4.Verilog代码module accum ( clk , rst , ena , data , a...

2021-10-31 16:46:21 1015

原创 RISC-CPU设计(三):指令寄存器模块设计

1.指令寄存器模块的作用 顾名思义,指令寄存器用于寄存指令。2.模块端口图​​​​​​​3.端口功能描述 指令寄存器的触发时钟是clk,在时钟上升沿的触发下,寄存器将数据总线送来的指令存入低8位或高8位寄存器中。但并不是每个clk的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存,由CPU状态控制器的LOAD_IR信号控制。LOAD_IR信号通过ENA端口...

2021-10-30 17:17:41 1367

原创 RISC-CPU设计(二):RISC-CPU的结构及时钟发生器的设计

1.RISC-CPU的结构 简化的RISC-CPU由8个模块组成: (1)时钟发生器; (2)指令寄存器; (3)累加器; (4)算术逻辑运算单元; (5)数据控制器; (6)状态控制器; (7)程序计数器; (8)地址多...

2021-10-29 09:13:53 997

原创 乒乓操作(Ping-Pong)的理解:为什么是另一种pipeline?

1.乒乓操作的原理 乒乓操作用于数据流控制的处理技巧。 在两个功能块(function block)对接时,由于瞬时数据率的差异(如block A的写数据频率为200Mhz,而block B的读数据频率为50Mhz),或数据顺序的差异(如block A发送的数据为顺序发送,block B接收数据的顺序为逆序接收,即从最后一个字节开始接收)等原因,导致这两个模块不能同时工作。为了提高电路的数据处理效能,可以用ping-pong buffer结构连接这两个模块,让它们能够同时...

2021-10-28 09:52:45 17232

原创 RISC-CPU设计(一):基本概念

1.什么是CPU CPU,即Central Processing Unit(中央处理单元)的缩写,是计算机的核心部件。ji'suan'q

2021-10-27 22:48:26 575

原创 Verilog中的变量节选(part-select):中括号[]中的加号(+:)和减号(-:)的作用?

Verilog 1995 允许在节选范围的索引为常数时从一个向量中节选连续的比特。Verilog 2001,2005 提供了两个新的节选运算符来支持固定宽度的变量节选:+:和 -:,其语法分别为:[ < starting_bit > +: < width >] 和 [ < starting_bit > -: < width >] 参数 width 指的是节选部分的长度, starting_bit 则指明了向量中被选部分...

2021-10-27 11:15:28 6663 3

原创 on-chip-bus(二):APB总线详解——什么是有等待传输和无等待传输?读操作和写操作的细节差异

1.概述 APB(Advanced Peripheral Bus,先进外设接口)是AMBA3协议家族的一部分。它提供了一种低成本的接口,在优化最低功耗的同时降低了接口复杂度。由APB Bridge和APB上的从设备两部分组成,主要用于读带宽的外设。 为了让APB外设易于集成到任何设计流程中,APB规定所有信号必须在时钟上升沿触发时进行传递。APB可以与AMBA的AHB与AXI进行接口拓展,可以使用APB来提供对外设的访问。AHB/AXI与APB之间通过...

2021-10-26 11:02:51 1761

原创 on-chip-bus(一):DDR的原理和行为:什么是突发传输?为什么DDR中要有多个bank?

1.DDR SDRAM 即Double Data Rate SDRAM。DDR在每次传输数据的时候,在每个时钟脉冲的上升沿和下降沿都传输一次数据,所以称为“Double Data Rate”。其数据传输频率是核心频率的2倍。2.DDR的内部结构DDR的内部一般有8个Bank,每个Bank都是一个存储阵列,由M行N列组成。在寻址时,只要给出需要哪一个Bank的哪一行,以及哪一行中的哪一列,即可找到其中的数据。 而左下角的Comma...

2021-10-25 11:18:23 3945 1

原创 STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?

1.什么是STA? STA(静态时序分析)是时序验证的一种方法,是用于计算和分析电路是否满足时序约束的要求。2.为什么需要STA? 电路能否正常工作,其本质上是受最长逻辑通路(即关键路径)的限制,以及受芯片中存储器件的物理约束或工作环境的影响。 为了保证电路能够满足设计规定的时序规格及器件的约束条件,必须验证关键路径以及与关键路径延迟相近的通路是否满足时序要求,这就必须考虑逻辑门的传输延时、门之间的互连、时钟偏移、I/O时间裕度以及器件约束(建立时间...

2021-10-23 19:54:34 25170 9

原创 流水线(pipeline)设计详解+实例:为什么要用流水线?流水线的作用和优缺点?流水线深度越大越好吗?什么时候采用流水线?

1.流水线设计的概念 所谓流水线设计,实际上就是把规模较大、层次较多的组合逻辑电路分为几级,在每一级插入寄存器组并暂存中间数据。K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入而又无反馈的电路。2.流水线的作用 (1)流水线可以提高电路的吞吐率 吞吐率就是数据输入机器的速率或处理数据的速率。吞吐率最终受到以下几种具有最大传播延时的通路的限制: a. 原始输入到一个寄存器的通路; ...

2021-10-19 19:06:30 23643 5

原创 Booth乘法器(Radix-4)算法实现流程详解

1.首先先看这张耳熟能详的编码表:对于某个乘法 A x B, B都可以用上面的编码表来进行编码。具体方法是:对B首先进行位拓展:最低位补一个0,最高位补两个符号位。比如对于B = 11,二进制就是1011,位拓展后就是0010110.再看编码表:最低三位为110,对应编码表中的 -1, 再往前三位是101, 对应编码表中的 -1, 最高三位为001,对应编码表中的 +1. 所以 B=11 的Booth编码为 1(-1)(-1):2.再来执行具体算法流程:对于 A x B(如12x11..

2021-10-17 11:06:01 5332 1

原创 Moore型状态机和Mealy型状态机的区别以及各自Verilog的实现细节:为什么Moore型状态机需要多一个状态?怎么选择用哪一种状态机?

Moore型状态机和Mealy型状态机的区别(1)Moore型状态机:输出信号只取决于当前状态。(2)Mealy型状态机:输出信号不仅取决于当前状态,还取决于输入信号的值。它们的区别就在于输出信号是否与输入信号有关,造成的结果是:实现相同功能时,Moore型状态机需要比Mealy型状态机多一个状态,且Moore型状态机的输出比Mealy型延后一个时钟周期。这里举一个HDLBits上的例子:这两道题目要求分别用Moore型状态机和Mealy型状态机来实现对输入信...

2021-10-06 20:36:51 10760 4

原创 JAVA:二叉树的遍历方式总结:深度优先遍历、广度优先遍历+前中后序遍历的递归、迭代法实现

1.二叉树的主要遍历方式(1)深度优先遍历:遍历时往树的深处遍历,遇到叶子节点就返回。可以用递归法或迭代法实现。一般用递归来模拟往深处遍历的过程。 进一步可以分为前序遍历、中序遍历和后序遍历。前序遍历:先遍历中间节点,然后左节点,最后右节点。(中左右)同理,中序遍历:左中右;后序遍历:左右中。判断技巧是:中间节点在的位置就是遍历的顺序。比如中左右,中间节点在前,就是前序;左中右,中间节点在中间,就是中序;左右中,中间在最后,就是后序遍历。比如这棵二叉树:前序遍...

2021-10-02 19:12:45 1063

原创 C/Perl中的值传递和地址传递

对于如下C程序:#include<stdio.h>void swap (int a, int b) { int temp; temp = a; a = b; b = temp;}int main () { int a = 1; int b = 2; swap(a, b); printf("a = %d, b = %d\n", a, b);}我们知道,程序的结果是 a = 1, b = 2, 也就是说并没有交换:因为在调用swap函数时进行的是值传递,而在

2021-09-29 10:35:04 160

原创 卡诺图中的d项化简

今天在做HDLbits的时候遇到这样一题:就是对上面的卡诺图进行化简,给出输出 out 的表达式对于这个卡诺图,出现的d可以当作0,也可以当作1。表达式: out = a + b'c最后答案: assign out = a | ( !b & c );...

2021-09-23 10:33:44 6562 1

原创 异步FIFO设计:各个模块的作用及Verilog代码详解

实现原理参考:异步FIFO---Verilog实现_alangaixiaoxiao的博客-CSDN博客_异步fifo代码参考:IC基础(一):异步FIFO_MaoChuangAn的博客-CSDN博客_异步fifo1.异步FIFO设计的关键点:(1)二进制码到格雷码的转化:二进制码的最高位不变,其余位分别与自己的左边一位进行异或,得到的就是格雷码。也就是将二进制码右移一位后再与自己异或,就得到了对应的格雷码。即: assign gray = ( bin >> 1 )...

2021-09-21 21:56:10 1780 1

原创 JAVA:用Lambda表达式对二维数组中的某个元素排序

1.对nums中的数组按照第一个元素降序,第二个元素升序进行排序:int[][] nums = {{0, 1}, {7, 0}, {4, 4}, {6, 1}}; //比较第一个元素是否相等:是,按第二个元素升序排列;否,按第一个元素降序排列Arrays.sort(nums, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);2.反之,对第二个元素降序,第一个元素升序时:Arrays.sort(nums, (a, b).

2021-09-15 10:14:37 789 1

原创 UVM(一)win10+QuestaSim 从零开始搭建UVM验证环境:Hello UVM

1.安装环境准备:(1)安装Modelsim SE-64 10.4或Questa Sim-64 10.6c(2)安装Gitbash,参考软件工具——Git下载安装_qifengsunny的博客-CSDN博客_git工具下载安装(3)安装gvim(可选)2.搭建第一个UVM环境(1)新建一个文件夹,这里我的目录是D:\software\modelsim\project\uvm0(2)在这个文件夹中新建一个文本文档,命名为 hw.sv(3)打开这个sv文件,复制代码块:...

2021-09-14 17:34:29 3030 5

空空如也

空空如也

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

TA关注的人

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