type
status
date
slug
summary
tags
category
Property
Nov 30, 2023 02:46 PM
icon
password
属性
属性 1
描述
Origin
URL
 
 
 
notion image

Uart模块设计理解

通用异步收发协议
UART:通用异步收发器。它是一种通用串行数据总线,用于异步通信。
该总线双向通信,可以实现全双工传输和接收。 UART工作原理:是将数据的二进制位一位一位的进行传输。
notion image
发送连接接受
UART1发送从数据总线(data bus)获取并行数据后添加起始位、奇偶校验位和停止位,以创建数据包。接着,数据包在Tx引脚上逐位串行输出。 UART2接收从其Rx引脚上逐位读取数据包。然后,将串行数据转换成并行数据,并删除起始位、奇偶校验位和停止位。最后,将并行数据包传输到接收端的数据总线。
协议就是·标准,定死的。约定俗成
notion image
校验位:检验是奇数还有偶检验
奇校验:7位,二进制为111,1的个数已经是奇数个了,就配个0,为1110。
偶校验:6位,为1。
notion image
 
notion image
注意事项: 当然两个设备使用UART串口通讯时: 1、必须先约定好传输速率(波特率),发送和接收UART之间的波特率只能相差约10%。 2、必须将发送和接收UART配置为相同的数据包结构。
红色为发送逻辑和绿色的接受逻辑()
发送的高八位丢弃。
 
发送逻辑 UART发送FIFO是一个8位宽,16位深度的内存缓冲区。CPU通过APB总线接口写入的数据存储在FIFO中,UART发送逻辑取发送FIFO中的数据,执行并行到串行转换,控制逻辑输出串行数据流,该串行数据流格式为:起始位、数据位(以LSB开始传输)、奇偶校验位、停止位。 发送FIFO可以被禁用,仅当作一个单字节的保持寄存器。
 
接收逻辑 UART接收FIFO是一个12位宽,16位深度的内存缓冲区。当UART控制逻辑检测到有效启动脉冲后,接收逻辑将RX端口的串行比特流转换成并行数据,也执行奇偶校验位和帧错误检查,并将数据和它们的状态一起写到接收FIFO中,直到被CPU通过APB接口读出。 接收FIFO也可以被禁用,仅当作一个单字节保持寄存器。
 
寄存器配置 寄存器是用来存储通过APB接口写入或者读取的数据。 波特率值通过设置寄存器(UARTIBRD和UARTFBRD)来实现;
UART数据包格式、FIFO是否使能、中断是否使能等都是通过配置相应寄存器来实现的。
notion image
notion image
notion image
 
SPEC
寄存器的配制
重要的寄存器有UARTDR\IBRD\FBRD\LCR_H\CR\
notion image

验证点的提取

GPU中晶振就一个,但时钟可以分频,有上百个
模块的验证流程
notion image
验证策略和验证方法
notion image
提取验证点
notion image
notion image
notion image

画出UART验证环境框架图

备注: 环境中提供了apb_uvc和uart_uvc,要求将其集成到整个验证环境中使用。
框图描述
1.DUT有两个接口,分别是uart interface和apb interface .
2.从顶层向下TOP,里面是个大的test,reg_model挂在adapter上,与APB_uvc连接在一起。写在test里面
3.test下面有一个大的test_env,包括apb_uvc和uart_uvc,apb_uvc中mst_agent中有sqr和drv,collector和monitor,config通过test里有两个apb_config和uart_config set进来配制寄存器。uart_uvc有两个agent,一个是active agent,一个是pasive agent。
4.路径有两条:第一条发送路径(transmit),由mst_agent里的drv-RX_agent里的monitor通过下面两个fifo发送到scoreboard里进行比较。第二条路径(receive),是由Tx_agent里的drv发送apb_monitor接受,上面两个fifo进行比较。
5,test中的Vsqr里面有APB_sqr和UART_sqr,负责管理,p_rm是reg_model的指针。
 
notion image
notion image

lab1 基本的连接

1、将apb_uvc和uart_uvc集成到环境中;
notion image
2、实现virtual sequencer;
notion image
修改Package
notion image
3、实现base test;
notion image
4、实现顶层模块,完成DUT例化。
notion image
notion image
运行结果
notion image

lab2 APB接口写入数据并读出,从TX发送出去

1、先通过apb接口向dut写入数据功能,然后读出该数据(调用apb_uvc里面的sequence即可); 2、将apb接口写入的数据通过dut的tx接口发送出去。
notion image
连接关系:
在test里面启动vseq在vsqr上。(config_db)
在vseq里面启动seq在下面的sqr上(uvm_do_on)
在vseq里面管理seq,pre_body和post_body:raise和drop.
seq则是配制寄存器和写入数据。
 
1.1 先在base_test中拓展出名为apb_2_dut_test的test(启动Vseq名为apb_2_dutvsqr的main_phase上)
notion image
1.2 实现apb_2_dut,定义里面的读写seq,启动在p_sqr的mst_sqr上。
 
notion image
1.3建立base_vseq,是vseq, 里面什么都不干,管理seq,真正的seq从里面extend出来。(在vseq里raise和drop);
 
notion image
 
1.4 建立base_seq,从中extend出来一个apb_config_sequence,在里面配制寄存器。这个是真正的seq,配制寄存器一定要写注释,不然很快就会忘记。
配制完成之后随机十次数据。
 
notion image
notion image
配制基本的寄存器,打开相应的功能,结束后,再写入55,保证能够写入。
notion image
结果
notion image
notion image
 
lab2例1 (1)
lab2例2※ (1)
lab2例3 (1)
lab2例4 (1)
lab2例5 (1)
 

lab3 通过寄存器模型重新实现一遍

通过寄存器模型实现dut功能的基本配制,可以用脚本自动生成。
notion image
lab3例1 (1)
lab3例2 (1)
lab3例3 (1)
notion image
notion image
 
修改base_test,放入寄存器模型和adapter的指针,配制寄存器模型和转换器,并做相应连接。
notion image
notion image
增加Vsqr的p_rm的指针
notion image
修改package
notion image
最后在apb_2_dut的vseq里用写入数据。
这里的p_sqr就是vsqr的类型的一个转换,目的是让object类(seq)可以访问test(component),所以可以直接调用里面的p_rm。这其实就是一个lab2用seq名的一个改写,方便配制寄存器。
启动seq与下面的sqr连接
notion image
 
notion image
 

lab4 UART基本的接受功能,RX输入由串转并

notion image
lab4例1 (1)
lab4例2 (1)
lab4例3 (1)
lab4例4 (1)
lab4例5 (1)
 
 
修改makefile名字
notion image
建立新的test名,从test中extrend出来,uart_2_apb建立这个seq,用configdb的方式启动在vsqr的mian_phase上。前面的configdb是配置协议,
notion image
完善vseq,在里面添加uart_2_apb的seq,同样在vseq里面raise和drop,不动。
notion image
 
extend出新的vseq,管理seq,statue是配制寄存器,value是写入数据。
前门访问是通过总线访问,后门访问是直接修改dut里面的寄存器。
notion image
建立新的uart_2_apb的seq,并通过uvm do的方式直接启动。
notion image
notion image
波形如下,
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 

lab5 实现SCB

在lab4的基础上实现实现scoreboard,对比dut输入和输出的数据。
目的:自己对比,不用自己每次都去对比看那波形或者log;
需要重点把握两个:功能怎么实现,以及怎么连接。
lab5例1 (1)
lab5 例2 (1)
lab5 例3 (1)
lab5 例4 (1)
 
和框图有关,定义了四个fifo, 17行到23行,定义了4个fifo,
25行,注册
31行,开始,new,在main phase里面,这个是固定写法
40行,在mian phase里写了count,比较transmit和receive的数据。47行和48行是两个task
52行,打印比较了多少次
 
notion image
#40行两个count,比较了多少bit。
46行fork join里面定义两个task,一个是transmit,另一个是recieve
52行打印DUT比较成功了多少次,UVC比较成功了多少次。
notion image
#62行,task的实现,这个task实现的是transmit路径,uart-apb,由串转并。
通过一个fork join块,里面有两个while begin 循环.
第一个循环从apb的uvc取数据,get transaction ,如果数据地址等于0方向为write,取出transction ,存到队列q(wr.data)里面去。
第二个while, 连在uart上的,72行,从uart这侧get(frame), 如果(q)wr_data大于0,就pop出来赋给temp1,比较对了,count++,如果对了,successfully,错了就直接最好error,但为了方便调试,就先打印了info。
notion image
recieve这一段就是相反的。
while1, uart这段get,存起来,
apb这边就pop
notion image
env里面进行一个连接,ansys_port连接四个fifo。
notion image
apb_wr和uart_rx都是连到scb里面
 
notion image
 
notion image
 

lab6 实现覆盖率的收集

lab6 例1 (1)
首先是coverage,#2,3定义两个imp ,monitor里面不仅可以连到fifo里面还可以连到imp。一对多
notion image
定义了两个coverage,分别是tx-frame和rx-frame。收集frame的payload。
#52主要是例化imp,cov,重命名
notion image
转换类型。触发frame,前面的coverage。
notion image
环境中添加
notion image
build -phase里面添加coverage
notion image
connect 连接上
notion image
 
notion image
 
notion image
 
notion image

Case的添加

寄存器的复位检查

notion image
notion image

基本功能(9600)

notion image
notion image
notion image
notion image
-
notion image

基本功能(检验错误)

notion image
notion image
 
notion image
 
notion image

时钟不同

notion image
 
notion image
 
notion image
 
notion image
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
 

常见问题汇总:

TI

为什么用四个fifo,作用是什么?
你的reference-model怎么写的?
scb怎么写的?
 

奥比中光

config-db在哪里set哪里get;
波特率有哪几种?
 

联发科

1.scb怎么比较的
里面有uart的data下有payload,和apbdata比较
 
ZEKU
有什么bug,覆盖率多少?如何解决的?有多少个case?
 
 
 

总结提问

notion image
配置不一样会如何?
最后在scb中比较的时候,如果发送配置成5位的数据位,接受配置成8位的数据位,就会把数据位认为是校验位和停止位,报错。
2.uart协议是从高往低发还是从低往高发?
是从低往高,LSB-MSB
3.如何知道波特率配置成功了,uvc和dut相当于两个uart,uvc是标准的,买的vip,只要uvc和dut配置一样的,scb里面能够比较成功,说明配置成功了。因为两个互相能够通信基础就是波特率相同。
 
 
 
 
 
 

参考资料

 
秋招总结异步FIFO
  • Twikoo
  • Waline
  • Giscus
  • Cusdis
  • Utterance
Conor
Conor
一个野生的技术宅
公告
type
status
date
slug
summary
tags
category
Property
Nov 25, 2023 06:32 AM
icon
password
属性
属性 1
描述
Origin
URL
🎉持续更新中🎉