type
status
date
slug
summary
tags
category
Property
Nov 30, 2023 02:46 PM
icon
password
属性
属性 1
描述
Origin
URL
Uart模块设计理解验证点的提取画出UART验证环境框架图lab1 基本的连接lab2 APB接口写入数据并读出,从TX发送出去 lab3 通过寄存器模型重新实现一遍lab4 UART基本的接受功能,RX输入由串转并lab5 实现SCBlab6 实现覆盖率的收集Case的添加寄存器的复位检查基本功能(9600)基本功能(检验错误)时钟不同常见问题汇总:TI奥比中光联发科总结提问参考资料
Uart模块设计理解
通用异步收发协议
UART:通用异步收发器。它是一种通用串行数据总线,用于异步通信。
该总线双向通信,可以实现全双工传输和接收。
UART工作原理:是将数据的二进制位一位一位的进行传输。
发送连接接受
UART1发送从数据总线(data bus)获取并行数据后添加起始位、奇偶校验位和停止位,以创建数据包。接着,数据包在Tx引脚上逐位串行输出。
UART2接收从其Rx引脚上逐位读取数据包。然后,将串行数据转换成并行数据,并删除起始位、奇偶校验位和停止位。最后,将并行数据包传输到接收端的数据总线。
协议就是·标准,定死的。约定俗成
校验位:检验是奇数还有偶检验
奇校验:7位,二进制为111,1的个数已经是奇数个了,就配个0,为1110。
偶校验:6位,为1。
注意事项:
当然两个设备使用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是否使能、中断是否使能等都是通过配置相应寄存器来实现的。
SPEC
寄存器的配制
重要的寄存器有UARTDR\IBRD\FBRD\LCR_H\CR\
验证点的提取
GPU中晶振就一个,但时钟可以分频,有上百个
模块的验证流程
验证策略和验证方法
提取验证点
画出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的指针。
lab1 基本的连接
1、将apb_uvc和uart_uvc集成到环境中;
2、实现virtual sequencer;
修改Package
3、实现base test;
4、实现顶层模块,完成DUT例化。
运行结果
lab2 APB接口写入数据并读出,从TX发送出去
1、先通过apb接口向dut写入数据功能,然后读出该数据(调用apb_uvc里面的sequence即可);
2、将apb接口写入的数据通过dut的tx接口发送出去。
连接关系:
在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_dut在vsqr的main_phase上)
1.2 实现apb_2_dut,定义里面的读写seq,启动在p_sqr的mst_sqr上。
1.3建立base_vseq,是vseq, 里面什么都不干,管理seq,真正的seq从里面extend出来。(在vseq里raise和drop);
1.4 建立base_seq,从中extend出来一个apb_config_sequence,在里面配制寄存器。这个是真正的seq,配制寄存器一定要写注释,不然很快就会忘记。
配制完成之后随机十次数据。
配制基本的寄存器,打开相应的功能,结束后,再写入55,保证能够写入。
结果
lab3 通过寄存器模型重新实现一遍
通过寄存器模型实现dut功能的基本配制,可以用脚本自动生成。
lab3例1 (1)lab3例2 (1)lab3例3 (1)修改base_test,放入寄存器模型和adapter的指针,配制寄存器模型和转换器,并做相应连接。
增加Vsqr的p_rm的指针
修改package
最后在apb_2_dut的vseq里用写入数据。
这里的p_sqr就是vsqr的类型的一个转换,目的是让object类(seq)可以访问test(component),所以可以直接调用里面的p_rm。这其实就是一个lab2用seq名的一个改写,方便配制寄存器。
启动seq与下面的sqr连接
lab4 UART基本的接受功能,RX输入由串转并
lab4例1 (1)lab4例2 (1)lab4例3 (1)lab4例4 (1)lab4例5 (1)修改makefile名字
建立新的test名,从test中extrend出来,uart_2_apb建立这个seq,用configdb的方式启动在vsqr的mian_phase上。前面的configdb是配置协议,
完善vseq,在里面添加uart_2_apb的seq,同样在vseq里面raise和drop,不动。
extend出新的vseq,管理seq,statue是配制寄存器,value是写入数据。
前门访问是通过总线访问,后门访问是直接修改dut里面的寄存器。
建立新的uart_2_apb的seq,并通过uvm do的方式直接启动。
波形如下,
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行,打印比较了多少次
#40行两个count,比较了多少bit。
46行fork join里面定义两个task,一个是transmit,另一个是recieve
52行打印DUT比较成功了多少次,UVC比较成功了多少次。
#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。
recieve这一段就是相反的。
while1, uart这段get,存起来,
apb这边就pop
env里面进行一个连接,ansys_port连接四个fifo。
apb_wr和uart_rx都是连到scb里面
lab6 实现覆盖率的收集
lab6 例1 (1)首先是coverage,#2,3定义两个imp ,monitor里面不仅可以连到fifo里面还可以连到imp。一对多
定义了两个coverage,分别是tx-frame和rx-frame。收集frame的payload。
#52主要是例化imp,cov,重命名
转换类型。触发frame,前面的coverage。
环境中添加
build -phase里面添加coverage
connect 连接上
Case的添加
寄存器的复位检查
基本功能(9600)
-
基本功能(检验错误)
时钟不同
常见问题汇总:
TI
为什么用四个fifo,作用是什么?
你的reference-model怎么写的?
scb怎么写的?
奥比中光
config-db在哪里set哪里get;
波特率有哪几种?
联发科
1.scb怎么比较的
里面有uart的data下有payload,和apbdata比较
ZEKU
有什么bug,覆盖率多少?如何解决的?有多少个case?
总结提问
配置不一样会如何?
最后在scb中比较的时候,如果发送配置成5位的数据位,接受配置成8位的数据位,就会把数据位认为是校验位和停止位,报错。
2.uart协议是从高往低发还是从低往高发?
是从低往高,LSB-MSB
3.如何知道波特率配置成功了,uvc和dut相当于两个uart,uvc是标准的,买的vip,只要uvc和dut配置一样的,scb里面能够比较成功,说明配置成功了。因为两个互相能够通信基础就是波特率相同。
参考资料
- 作者:Conor
- 链接:https://www.xzhh.top/article/uart
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。