- 博客(62)
- 收藏
- 关注
原创 【i2c协议介绍】
需要注意的是,高速模式和快速模式可以向下兼容,即这两者均可以与标准模式总线混合通信,如fast模式和标准模式混用,fast模式速度可以调至0~100 kb/s, 与标准模式保持一致。不过,超高速模式不能向下兼容,在此模式下,总线只有写传输,无从机的确认,无需要反馈信号,比如应用在LED控制器时,需要大量数据,且无需反馈
2023-02-09 20:02:16
3522
2
原创 【verilog---- if else 与多if 代码综合电路区别】
if else 形式写的代码会被EDA软件综合为多路选择器,无优先级顺序。多if写的代码会综合成带优先级的电路,如下图所示,最后一级为最高优先级。
2022-11-21 15:56:23
1530
原创 找出一段二进制数中出现0的最低位的位置-C语言
思路:可以将一组二进制数存入到数组中,然后遍历数组,用每一位去与1进行与运算,若为0,则表示出现了0,则输出此时的位置。有一组十六比特的二进制数组,需要找出0出现的位置(在最低位出现时),如110011,则输出2。...
2022-08-07 19:21:58
1078
原创 fork join_none易错点
分析上述两种不同情况,可以发现,当延时语句在fork内部时,则此时父线程在i=3之前均无阻塞,那么此时forkjoin_none不会执行,仅当i=3时,父线程被阻塞,则forkjoin_none开始执行,所以打印结果为333。本篇博客记录一下自己在实际过程中遇见的易错的语法细节。具体看见sv标准(1800-2012)...
2022-07-25 14:40:02
837
原创 TCL脚本学习(过程与文件读写)
在TCL脚本中,过程相当于C语言中的函数,将一系列命令进行重复使用的接口。其语法格式如下:proc 为 TCL 语言过程体关键字。proc_name 为定义过程的名字。arguments 为输入的参数,参数个数可以为 0,也可以为多个。多个参数间用空格符分割。参数为 0 时,直接写大括号“{}”即可,但不可以省略大括号不写。statements 为过程内要执行的命令行。下面给出一个过程代码实例:全局变量和局部变量TCL中的全局变量与局部变量与常见的如C不同,TCL中的全局变量只作用于过程的外部。如
2022-07-02 15:40:25
4314
4
原创 正则匹配语法学习
在学习正则匹配的过程中可以参考链接:学习网站语法汇总:使用’-'代表区间:如a-z, 0-9匹配所有的数字,小写字母和大写字母当然,如果想匹配-, 可以使用\转义符用于匹配字符边界如匹配www.code...
2022-06-29 19:55:12
296
原创 tcl脚本学习-基础语法
复杂文本处理Tcl可以把文本中的每一行变为一个列表,最简单的列表就是包含由任意个空格、制表符、换行符分隔开的任意多个元素的字符串,可以直接根据元素编号来获取字符串内容Tcl也支持正则表达式自动化执行flow对于一些流程化的flow,可以编写Tcl脚本来自动执行,一键得到结果和report辅助EDA开发Tcl易上手、使用简便,可以简便地设计图形化界面;也可以针对大型项目设计EDA辅助工具Tcl脚本简介Tcl即Tool command language工具控制语言,读作TickleTcl包...
2022-06-29 18:42:03
1503
原创 C语言-找出0-100内的素数
c语言基础题-求质数即素数首先要知道素数的定义,素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任意整数整除的数。于是可以使用for循环和求余的方式实现此功能。实现代码如下:结果如下:...
2022-06-29 13:58:10
2987
原创 计数一段字符串中不同字母的个数-lfk真题
使用C语言实现一段代码满足以下要求:当输入一段字符串以后,可以输出不同字母的个数,如输入aaaggg,则输出3a3g直接给出代码:结果测试
2022-06-27 19:34:13
389
原创 【手撕代码-序列检测1011001-每次输入2bit】
请实现对(1011001)2的序列检测功能,模块每拍并行输入2bit,且顺序为高位先输入,当检测到序列,输出一拍高电平脉冲。序列检测题的关键是画出状态图状态图:
2022-06-23 19:52:56
357
原创 跨时钟域刷题
跨时钟域的信号分为两类,一类是单比特的信号,一类是多比特的信号。对于单比特信号,可以分为两种情况:对于多比特信号:一般采用异步FIFO、异步双口RAM、握手、格雷码方式处理。该题为笔试遇到的遇到真题,该题主要考察了多比特信号的处理,且为慢时钟域到快时钟域。思路:将计数结果换成格雷码,并在快时钟域下打两拍处理。2.仿真结果如下:当计数步进为2时,格雷码每次变化的数不为1,不满足单比特变化,在跨时钟域时容易出问题,使得采样有误。思路:将脉冲信号进行展宽,然后同步到慢时钟域,再将反馈回快时钟域的信号
2022-06-18 15:44:45
394
原创 异步复位同步释放的理解
在同步复位中,复位信息的传递由时钟信号控制,仅当时钟上升沿到来时才会将复位信息和数据d存入寄存器中。电路图如下:同步复位优缺点:代码实现异步复位与同步复位相对应的异步复位则不受时钟的控制,由下图看出,异步复位多了一个rst复位线,于是电路可以随时进行复位。不受限于时钟上升沿的到来。异步复位优缺点:代码实现:异步复位,同步释放异步复位同步释放其实相当于将信号打两拍,避免异步复位释放引起的亚稳态。即使Q1输出信号为亚稳态,但是从触发器此时的数据输入接收的还是主触发器输出的Q1稳态的复位状态0。所
2022-06-10 11:15:35
380
原创 边沿检测—Verilog
在设计中,需要检测某一信号发生0->1跳转的变化时,可以采用边沿检测。边沿检测的实现思路如下图所示,为了保证采样信号沿的准确,首先对信号进行打拍处理。由波形图可以看出,上升沿出现时,可以由d1与d2非的与检测得到,同理可得下降沿和双沿检测。实现代码如下:...
2022-06-10 10:02:33
3302
原创 systemverilog 中的always_comb, always_latch, always_ff
在verilog中,仅从alwasy关键字中不能直接看出设计者需要设计的是什么电路,为此SystemVerilog把always细化成always_comb, always_ff, 和always_latch。使综合工具可以自动检查各种细节,降低了设计失误的可能。always_comb表示设计者想要设计一个组合逻辑电路。中使用alway_comb以后,不必再写敏感信号列表。另外,always_comb会告诉综合工具,这里需要的是一个组合逻辑电路,假如我们设计时,if语句或者case语句没有写完整,在综合时,
2022-06-08 16:26:28
1954
原创 【verilog中的阻塞赋值与非阻塞赋值】
文章目录1: 非阻塞赋值语句2:阻塞赋值语句总结1: 非阻塞赋值语句非阻塞(Non_Blocking)赋值方式块结束后才完成赋值操作。b的值并不是立刻就改变的。对于时序电路中的always块的reg信号,一般采用非阻塞语句赋值。这种方式的赋值并不是马上执行的,也就是说always块内的下一条语句执行后,b并不等于a,而是保持原来的值。always块结束后,才进行赋值。如:module no_blocking (clk, a ,c ); input cl
2022-05-26 10:51:28
1713
原创 24位数据转128位
实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高bit位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;clk是时钟信号;rst_n是异步复位信号。此题关键在于将24位数据凑成128Bit因为1283 = 2416直接给出代码:module width_24to128( input clk , input rst_n , input v
2022-05-02 17:47:03
457
原创 数据累加输出---verilog
文章目录介绍思路分析代码实现介绍本题目来源为牛客网中在线编程>verilog模块,要求实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时,数据传输无气泡,不能由于本模块的设计原因产生额外的性能损失。电路的接口如下图所示。valid_a用来指示数据输入data_in的有效性,valid_b用来指示数据输出data_out的有效性;ready_
2022-05-02 15:41:16
5413
1
原创 driver与monitor间的数据传输--UART
文章目录uart发送数据(driver)uart接受数据(monitor)uart发送数据(driver)CPU通过APB总线给uart写入数据,将数据保存在TX_FIFO中,然后通过uart_driver将并行数据串行的发送到总线上。注意:发送时,应该符合uart的通信协议,在不发送数据时,sline.data应该保持高电平,当其拉低以后,表明数据传输开始。同时,数据传输应该根据波特率配置,并采用16倍频发送。具体可看uart波特率模块在发送完前四个数据以后,后续5到8位的数据发送应该由LCR寄存器
2022-04-30 19:16:05
1413
原创 notepad++实现verilog代码的编译
介绍在verilog学习中,我们想要检查代码的语法是否有误,一般需要在questasim或者其他的工程软件中进行编译仿真,大大降低了开发速度。对此,notepad++编辑器中可以通过安装插件的方式,直接在notepad++中实现编译,检查语法的正确性。安装步骤打开notepad++ 软件,依次点击插件,选择插件—NppExec, 点击安装即可。点击f6键,在出来的界面中,输入如下命令,保存为任意一个名字即可,这里为runverilogcmd /k cd "$(CURRENT_DIRE
2022-04-24 10:31:24
3785
1
原创 UVM产生异常激励的方法
在UVM中,提供了三种产生异常激励的方法(以白皮书中源码为例)在my_transaction中添加一个crc_err的标志位这样,在post_randomize中计算CRC前先检查一下crc_err字段,如果为1,那么直接使用随机值,否则使用真实的CRC。class my_transaction extends uvm_sequence_item; rand bit[47:0] dmac;//A 48-bit Ethernet destination address rand bi
2022-04-23 14:37:22
697
原创 笔试真题-LFK
本文整理了一些LFK最近笔试的代码题。set a {12}set b {345}set c {6789}lappend a $blappend a $c#如何从a中得到6?这道题考了TCL脚本的使用解决方法如下:set str [lindex $a 2]string range $str 0 0
2022-04-19 18:36:36
162
原创 C语言手撕代码
本文总结了一些在笔试中常见的一些C语言代码题。文章目录冒泡排序字符翻转冒泡排序冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。实现代码如下:#include <stdio.h>void bubblesort(int a[],int length);void swap(int a[],int i,int j);int main(){ int
2022-04-19 16:48:23
1201
转载 Systemverilog中关于@和wait的区别
Systemverilog中@和wait區別及應用案例分析 前言:在SystemVerilog中,用来触发事件时,使用->;用来等待事件使用@或者wait。那么@和wait有什么区别呢?在Verilog中当一个线程在一个事件上发生...
2022-04-18 21:30:03
3262
原创 UVM中sequnece的启动
文章目录sequence介绍sequence 向sequencer发送transaction`uvm_do方式发送直接发送启动方式1. 通过start启动2. 使用default_sequencesequence介绍本文代码参考自《UVM实战》sequence不属于验证平台的任何一部分,它与sequencer之间有密切的联系。sequence中封装着激励数据transaction,是一个uvm_object,使用uvm_object_utils宏注册到factory中。而sequencer是一个uvm
2022-04-12 19:02:22
1420
原创 uart_env环境各组件连接结构理解
在UART项目的学习过程中,发现对于uart_env层次的各组件连接关系理解易于混淆,于是梳理了一下各组件的连接关系,绘制如下所示层次图。下面会简述一下各组件的连接方法。首先,对于一个uart_env模块,其内部例化了uart_env_config的配置模块,可以对apb,uart, modem这三个不同协议的agent进行配置。在apb_agent模块中,有一个analysis_port端口,连接reg_predictor,通过ap端口,将apb_agent中由monitor收集到的数据交给寄存器模
2022-04-06 23:11:12
927
原创 verilog中数组的部分选择
在HDLbits中看见如下一道题:创建一个 4 位宽、256 对 1 的多路复用器。 256 个 4 位输入全部打包成一个 1024 位输入向量。 sel=0 应该选择[3:0] 中的位,sel=1 选择[7:4] 中的位,sel=2 选择[11:8] 中的位等。解题代码如下:module top(input [1023:0] in,input [7:0] sel,output [3:0] out);assign out = in[sel*4 + 3 : sel*4 + 0];endmod
2022-03-30 18:58:01
4269
原创 UVM中phase机制
文章目录phase分类function phase的运行task phase的运行super.phasephase机制的意义phase分类UVM中的phase,按照其是否消耗仿真时间($time打印出的时间)的特性,可以分成两大类,一类是function phase,如build_phase、connect_phase等,这些phase都不耗费仿真时间,通过函数来实现;另外一类是task phase,如run_phase等,它们耗费仿真时间,通过任务来实现。给DUT施加激励、监测DUT的输出都是在这些p
2022-03-29 20:29:13
2661
原创 UVM中objection机制学习
文章目录objection机制介绍objection使用注意点代码实例objection机制介绍在UVM中可以通过drop_objection来通知系统可以关闭验证平台,且在drop_objection之前raise_objection。在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经撤销后,那么就会关闭phase,开始进入下一个phase。当所有的phase都执行完毕后,就会调用$finish来将整个的
2022-03-29 19:44:26
1612
原创 波特率分频监测模块理解-基于apb_uart项目
文章目录模块介绍主要代码描述代码实例模块介绍该组件模块只要功能是检测特定波特率下的时钟分频是否正确,主要指IRQ.CLK在寄存器的控制下,是否正确分频成baud_out,其中 DIV2与 DIV2 寄存器的值和各个波形之间的频率关系如下图所示:通过验证在相邻两个 brg_en 时钟的上升沿之间有 16*{DIV2, DIV1}个 IRO.CLK 时钟的上升沿,可以说明寄存器 的功能是正确的。主要代码描述该组件中使用了三个 task:monitor_apb()、count_clocks()和 mon
2022-03-28 21:33:10
1976
1
转载 寄存器访问方法
本文转载自UVM糖果爱好者教程 - 16.寄存器访问方法 UVM的寄存器抽象层(RAL)提供了几种访问寄存器的方法。 这篇文章将解释寄存器访问方法的工作原理。 在Register Abstraction中,我们介绍了RAL的概述并解释了如何定义寄存器。 在这篇文章中,我们将介绍如何访问寄存器。uvm_reg_field的属性在深入了解寄存器访问方法之前,让我们看看如何存储寄存器值。 如寄存器抽象中所示,uvm_r
2022-03-26 21:54:49
1609
原创 不同形状信号产生电路
本题取自牛客网题库题目描述:请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。解析:要想实现方波,可以看到,方波类似于时钟信号,在本题中,我通过设计四分频电路的思路设计方波的产生,给波的峰值设置为10。实现锯齿波:将wave的值在每个时钟上升沿加一,当加到峰值10时,将其清零,随后继续重复此步骤。三角波形:对于三角波的产生,类似于
2022-03-19 19:04:04
163
原创 同步fifo设计
文章目录FIFO介绍:判断空满代码仿真波形FIFO介绍:FIFO表示先进先出的意思。是基于RAM的存储模块,一般多是用于缓冲数据。以代码中声明端口为例,对于一个FIFO来讲,通常具有时钟信号clk,复位信号rst,读写命令, 数据写入和数据读出。当写信号write_to_fifo拉高时且此时fifo未写满,fifo应该继续写入数据 data_in,当读信号read_from_fifo拉高且此时fifo不为空时,从fifo中读出数据data_out,write_to_fifo必须拉高数据才能写入,一旦
2022-03-18 20:52:30
410
原创 fifo深度计算
最近遇到关于fifo深度计算的知识点,于是想以一个例题来学习学习。题目描述:在一个fifo中,有一个100MHz的写时钟,每100个周期写入80个数据,另外有一个80MHz的读时钟,每个周期读出1个数据,那么fifo的深度应该设置为多大?从题中可以看出,这个fifo为异步的,要计算其最大的深度,首先需要考虑,我们计算的深度应该是fifo读写最繁忙的时间段,即写入数据最容易溢出的点,于是就涉及到back to back的概念.设想fifo在100个周期中,前20个周期不写入数据,随后80个周期写入,
2022-03-16 16:08:26
780
原创 【不重叠序列检测-状态机方法实现】
文章目录题目描述解题思路:状态转移图dut和tb代码:波形图题目描述编写一个序列检测模块,检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列,给出指示信号match。当不满足时给出指示信号not_match。上题出自牛客网中,本文简化了题目,即改为检测序列为0110解题思路:不同于常见的序列检测,要求检测重复序列,在画状态转移图时要注意,例如第一位不匹配,不应该返
2022-03-15 00:47:43
683
原创 dvt软件使用问题记录
首先将安装包解压缩到C:\dvt_eclipse(或自定义路径,我解压缩到D:\dvt_eclipse),然后复制license.dat到刚刚定义的路径中设置环境变量:DVT_HOME=C:\dvt_eclipseDVT_LICENSE_FILE=FLEXLMDVTLMD_LICENSE_FILE=C:\dvt_eclipse\license.dat运行bin\dvt.bat启动软件,并运行例子。一定要运行例子,才会产生flexlm.jar文件到安装目录如C:\dvt_eclipse中搜索文件.
2022-03-13 22:55:57
1608
4
原创 入门CMOS门电路
文章目录CMOS定义PMOS与NMOS两种MOS管的定义CMOS反相器用CMOS搭建逻辑门与非门或非门三态门CMOS定义在CMOS集成电路中,以金属-氧化物-半导体场效应晶体管作为开关器件。这种器件简称MOS管。作为CMOS电路,具有功耗低,抗干扰能力强,使用电压范围较大的优势。PMOS与NMOS两种MOS管的定义PMOS即以N型半导体作为衬底,同样NMOS以P型半导体作为衬底,衬底上具有两个高掺杂浓度的P或者N型区,形成了MOS管的源极(S)和漏极(D)。第三个电极称为栅极(G),通常以金属铝或者
2022-03-10 11:04:29
7377
2
原创 IC笔试常见问题
文章目录什么是建立时间与保持时间?什么是竞争和冒险什么是亚稳态摩尔状态机和米勒状态机的区别什么是建立时间与保持时间?建立时间(Setup Time)是指触发器的时钟信号上升沿到来以前,数据能够保持稳定不变的时间。输入数据信号应提前时钟上升沿(如上升沿有效)T 时间到达芯片,这个 T 就是建立时间通常所说的 SetupTime。如不满足 Setup Time,这个数据就不能被这一时钟打入触发器。保持时间(Hold Time)是指触发器的时钟信号上升沿到来以后,数据保持稳定不变的时间。如果 Hold Tim
2022-03-08 14:20:42
282
原创 模块(module), 程序块(program)的区别
文章目录moduleprogram注意点区别module在verilog中,模块可以用来描述从简单的门元件到复杂的系统 (例如一个微处理器)的任何一种硬件电路。模块除了可以为硬件建模外,也可以用来封装验证平台,在模块内部,我们可以例化采用模块定义的DUT和采用 program或者class封装的验证平台。program程序块可以被看作是一个具有特殊执行语义的模块。相当于软件领域。一旦被声明,一个程序块可以在需要的层次位置 (典型情况是顶层)中被实例化,并且它的端口可以像任何其他模块一样。程序块内的类
2022-03-08 12:07:20
2327
原创 【sv中枚举类型与字符串语法学习】
文章目录枚举基本语法类型转换枚举类型内置方法字符串内置方法枚举基本语法枚举类型可以用来声明一组整型的命名常量,定义具有强类型的枚举变量。枚举类型还可以使用枚举名字而不是枚举值来方便地引用或显示。当没有指定数据类型的时候,缺省的数据类型是 int。在枚举类型中使用的任何其他数据类型都要求显式地声明。枚举类型定义了一组具有名字的值。无论是枚举名 还是它们的 (整型) 数值都必须是唯一的。它们的值可以被设置为任意整型常量值,或者从初始值 0开始递增 (默认情况)。如果将两个值设置到相同的枚举名,或者设置的值
2022-03-08 11:31:48
1491
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人