如何用systemverilog为有CPU读写寄存器的模块创建验证平台 我现在一个周边模块timer, 其中有4个寄存器,分别为: 1,
TCNT :timer的计数寄存器,用来保存timer的 counter值 2,
TMOD:timer的模式寄存器,用来配置 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] : 8位CPU写数据总线 Timr_datard[7:0] : 8位CPU读数据总线 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,
写TCR的tsart bit 让timer模块动作。 我这个按循序要求的配置如何在 driver类里实现。 我看过systemverilog for verification里面最后的关于多单元通道的UART收发的例子,他采用的是在driver类里面直接写一个cpu_cfg() 的task,然后进行配置,这有个很大的缺陷是,cpu_cfg()里面不能接受testbench上个层次(generator产生的数据)。
现在假设可以我们扩展一下让他可以接受generator产生的数据通过mailbox,还有个一问题是如何让他按我上面的要求step1~step4的循序进行按步配置。
是在driver类里面添加额外的东西,还是在transaction里面添加额外的东西。让testbench正常的工作。不知道大家明白了我的意思和我的问题了没有。
我真的很郁闷啊。这个问题困扰了我很长时间。
|