中断了一段时间,终于又开始了,7月学习完OVM Cookbook的计划还是要继续,不能因为工作忙而放弃,找借口。
研究第7章,7.1/7.2节主要介绍的是example07-01.框架如下:
图1是OVM Cookbook的实现方法,看完source code分析之后,出现几个问题:
1. calc仅仅是产生request用,没有必要使用transport port, 可以使用简单的put port就可以了,calc本身并没有对response进行关注。书中的例子可能是为了扩展性和通用性采用了比较复杂的port. 实际工作中,当然需要尽量简化,去掉一些干扰思维的庞杂信息。当然前提也是需要保证扩展性。如果我设计这个例子,如果用图1的结构,我会使用put port来实现
2. 可以考虑图2的实现方式,似乎更简单,用组合的方式将calc放到tap里面去。transport_tap的主要目的是连接stimulus(calc)和DUT, 同时将request和response打包放到analysis port中以备后续分析。为了输出analysis port, 可以考虑用wrapper的方式来完成,也就是图2的架构,似乎更简单。、
对书中的一句话带有一个疑问,暂时不能回答:
“transport_tap设计的关键因素是它必须不能消耗时间,甚至是delta时间。“ 有可能这就是不能使用图2作为架构的原因,图2的架构我想也不会消耗delta时间,因为port的连接,仅仅是继承的函数调用而已,不会引入simulation调度。
对于使用Cadence IUS的人来说,学习OVM Cookbook有时候还真痛苦,太多system
verilog的语法不能支持。为了能够让example07-01可以在IUS下跑起来,去掉了关于IUS不能suport的coverage语句,这回导致fpu_coverage模块不能够done, 也就是stop()函数不能退出,整合simulation无法结束。
07-01的coverage结束条件是每个运算出现过至少2次即可,可以通过静态变量的方式来完成,于是我改写了fpu_coverage模块,通过static变量的counter机制,对每个运算设置一个静态变量,统计当每个变量都大于等于2的时候,done=1.这样simulation可以正常结束,OK.
simulation的结束,利用了OVM的stop函数同步机制。example07-01这个例子输出的information太少,最好在fpu_coverage里面增加$display(t.rsp.do_sprint());可以打印已经simulation的transaction, 这样更有感觉。