在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 14562|回复: 17

[求助] 如何用systemverilog为有CPU读写寄存器的模块创建验证平台

[复制链接]
发表于 2013-9-10 18:49:03 | 显示全部楼层 |阅读模式
300资产
本帖最后由 wrhwindboy 于 2013-9-10 19:00 编辑

如何用systemverilog为有cpu读写寄存器的模块创建验证平台

我现在一个周边模块timer, 其中有4个寄存器,分别为:

1,TCNT timer的计数寄存器,用来保存timer counter

2,TMODtimer的模式寄存器,用来配置 timer的工作模式

    1计数模式

    2外部event 计数模式

    3定时器模式

3,TCR:可以设置timer的工作频率。以及用TCR.Tstart位来启动这个timer模块工作

这些寄存器可以用CPU的总线进行配置

CPU的总线:

      Clk            :时钟

      Cpu_rw     :  当为1时为read 周期,当为0时为write周期

      Cpu_addr[15:0] :16位地址总线

   Cpu_datawr[7:0] : 8CPU写数据总线

      Timr_datard[7:0] : 8CPU读数据总线

   Psel                      :周边模块的片选信号,当选选中timer的寄存器时有效,

   Penable  
周边模块的读写使能信号。 0:不能读写周边模块。 1:可以读写周边模块

   

现在我想用systermverilog来搭建这个模块的验证平台:

验证平台的基本想法是这样的:

1,我要定义transaction类。里面包含timer寄存器的地址变量,

存储寄存器的值的变量。

Addr_tcnt, data_tcnt

Addr_tmod ,data_tmod

Addr_tcr,   data_tcr

2然后定义generator 类。


里面包含了如何 randomize来产生上面transaction类里面定义的变量的值,也就是个寄存器的地址和对应的值。然后通过 mailbox传递给driver类。

3,然后定义driver类来给DUT加驱动和进行DUT的配置,interface的话假设已经定义好了。

Driver类里面一定要包含通过CPU读写周边模块寄存器的task().

那我这个driver类的task定义为:

Cpu_write()

Cpu_read();

问题来了我的CPU_write()cpu_read()应该怎么写。

我现在的想法是:

Cpu_write(inputlogic[15:0] addr,  input logic[15:0]data)

Addr:写的地址, data:写的数据

但是现在我应该如何操作才能对前面的的3个寄存器按顺序进行配置呢?

因为一般的MCU里面的周边模块要动作,都是先配置寄存器然后启动模块工作。

那我现在要先配置寄存器

1,TCNT 初始化counter的初期值。

2,TMOD配置工作模式,

3,TCR的分频bit,选定分频

4,TCRtsart bit timer模块动作。

我这个按循序要求的配置如何在 driver类里实现。

我看过systemverilog for verification里面最后的关于多单元通道的UART收发的例子,他采用的是在driver类里面直接写一个cpu_cfg()

task,然后进行配置,这有个很大的缺陷是,cpu_cfg()里面不能接受testbench上个层次(generator产生的数据)


现在假设可以我们扩展一下让他可以接受generator产生的数据通过mailbox,还有个一问题是如何让他按我上面的要求step1~step4的循序进行按步配置。


是在driver类里面添加额外的东西,还是在transaction里面添加额外的东西。让testbench正常的工作。不知道大家明白了我的意思和我的问题了没有。


我真的很郁闷啊。这个问题困扰了我很长时间。

 楼主| 发表于 2013-9-18 07:18:31 | 显示全部楼层
顶啊。。。。。。。。。。。。
发表于 2013-9-18 10:30:14 | 显示全部楼层
帮顶,等答案,同学习。
发表于 2013-9-20 08:01:46 | 显示全部楼层
不是真的可以回答你的问题,不知道你是否考虑用UVM。如果是的话,可以看一下UVM_REG相关的例子。

关于顺序配置的问题,应该没有办法用随机来做,要自己指定顺序,但是可以随机生成寄存器内容。
发表于 2013-9-20 10:10:10 | 显示全部楼层
这个其实就是sequence的作用,按照你所说的顺序,连续do几次transaction 每个transaction是其中的一个任务即一个配置。
发表于 2013-9-22 11:12:48 | 显示全部楼层
配置数据也看作是一个个事务,只是有特定约束的事务,在generator中随即化的时候先按顺序随即化配置的事务,再随即化一般的事务。这样可以将它们统一起来管理,简化了driver的设计,把问题交给了generator
发表于 2013-9-24 11:50:53 | 显示全部楼层
http://bbs.eetop.cn/thread-421521-1-1.html
可以参考下我的帖子,自己搭寄存器模型比较复杂。
发表于 2013-9-26 09:46:17 | 显示全部楼层
回复 7# see01995


    朋友,能给我一个完整的图片吗  你上传的图片右部分看不见啊
发表于 2013-10-10 08:02:24 | 显示全部楼层
我觉得直接用CPU调用程序的二进制或者16进制文件做为TESTBENCH更好,这样跟实际应用也最接近,会起到更好的效果。
发表于 2013-10-10 20:59:08 | 显示全部楼层




    基本同楼上,可以把配置寄存器和启动分开成两种transaction。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 09:50 , Processed in 0.030812 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表