求助:uvm的cpu_transaction与C程序的交互
我想用UVM搭一个验证环境,但是同事要求能通过C函数来实现DUT的配置。比如说,初始化DDR或者UART的时候可用C函数直接写write(addr,data)这样的命令来执行,配置好设备之后,用C函数run_test1(),让UVM跑test_case1,run_test2()跑test_case2。我一点头绪都没有,有没有能指点一下的?
主要有几点:1. AHB总线上是有read也有write,写的时候好办,跟其他driver一样的写法,但是read的时候,driver可以取代monitor的功能,除了驱动总线之外,还监听总线上read的数据么?
2. 好像在哪儿看到过这种CPU配置寄存器的,需要register_sequence,还需要adapter,这部分我完全没概念呀,能否不采用这种方法?
3. 单纯的systemverilog中实现与C的DPI我知道怎么弄,但是换成UVM……,以前单纯用systemverilog搭验证环境的时候,是纯粹用C函数来控制仿真的进程的,但是UVM中有phase,怎么才能让C来插一脚呀?
可能这些问题在你们看来不是问题,但是我才刚接触UVM,在有些地方还不是很了解,如果涉及基础性的问题,能否指点一下要加强哪方面的知识?先谢谢诸位啦!
帮小编顶一个。
我刚接触UVM不久,说一点自己的想法,仅供参考
针对第1点,感觉还是把driver和monitor分开写比较方便,特别是AHB这种有流水结构的。如果写在一起,你可以在driver中例化一个analysis_port,数据读取出来后直接write()。
针对第2点,UVM里面有register_model的主要功能之一就是抽象激励的层次,把bus_seq_item转换成更简单的register_seq_item,从而激励就只有对寄存器的读写操作,而不是相对复杂的AHB操作。你同事的目的也就是这个吧。可以去verificationacademy找相应的资料
第3点就不知道了,没有尝试过。
非常感谢!
您好,我刚接触这个,想向您请教一下,像AHB这样的流水线操作总线模型的话,我该怎么写driver呢?比方说 我现在用sv写了一个generator和driver,driver从generator那里得到了一个transaction,然后发送给dut,然后再接收一个transaction,这样就体现不出 流水线操作了,能不能请教一下,这该怎么处理呢?
这个uvm的cookbook里有提到过怎么写pipelined driver,你可以去查下,我前段时间写了一个带pipeline的,非常麻烦。我后来发现,其实没必要用pipeline的,因为CPU一般是不会连着发single pipeline的。如果是IP level的话,其实用single的就够了。如果非要用的话...我的做法在driver里面把transaction存成一个队列来操作,这样也比较麻烦...
我来顶一个
顺便学习下
现在问题解决了没啊?
没有啊。等着呢。
我正准备学习UVM,以后多交流。
1. AHB总线上是有read也有write,写的时候好办,跟其他driver一样的写法,但是read的时候,driver可以取代monitor的功能,除了驱动总线之外,还监听总线上read的数据么?
这个不是可不可以的问题,而是应该不应该的问题吧?可以,连好肯定能通,但是driver的resp port,但是和mon功能完全不一样,这样连接完全不合常理,感觉不好,必须分开写。
2. 好像在哪儿看到过这种CPU配置寄存器的,需要register_sequence,还需要adapter,这部分我完全没概念呀,能否不采用这种方法?
就算是RAL也必须完成读写过程,front door read/write,back door peek/poke,
所以如果比较简单,像只是ddr初始化或者uart配置,而且用c配置,就没有必要用这种方法了
3. 单纯的systemverilog中实现与C的DPI我知道怎么弄,但是换成UVM……,以前单纯用systemverilog搭验证环境的时候,是纯粹用C函数来控制仿真的进程的,但是UVM中有phase,怎么才能让C来插一脚呀?
不太理解,DPI与方法一点关系都没有,所谓phase,其实就是一串virtual task/function而已,而c也是,直接调用不就可以了吗?
你是说,在phase中直接调用C的function,还是C中直接调用run_phase()之类的?
c中无法调用phase,原因是c只能调用静态函数,而phase是动态class生成的。
如果必须使用uvm的phase,只能先建立一个transaction_base类,静态声明后,
在使用时,把静态的类override自己定义的类中去。
关于pipe其实比较容易,
定义每次返回时的时间,在总线出现命令时和数据是各返回一个事件,
但命令返回时,可以得到下一个命令,当数据返回时,可以返回数据。
为什么C只能调用静态函数呢?应该是静态和动态都可以吧?
一起学习下