|
楼主 |
发表于 2014-7-9 22:21:28
|
显示全部楼层
本帖最后由 asic_wang 于 2014-7-9 22:31 编辑
2.我心目中的UVM factory的演进
2.1 使用继承来解决
2.1.1 前提:
(1)有一个基类叫做cpu_bus_driver,所以的cpu总线的driver都从这个base class继承
(2)cpu_bus_driver中定义一系列的总线操作,而且这写总线操作对它的任何继承者来说
都是充分的:
get_transfer():得到此次cpu操作类型(read or write),地址,长度,写数据
drive_bus():把读写操作转化成最后的signal level的信号
get_response():返回读数据或者写是否成功的响应(如果需要的话)
当然这些函数都是virtual的。
(3)cpu_bus_agent中这样实例化了driver
class cpu_bus_agent ;
.......
cpu_bus_driver driver ;
function build();
. .......
driver = new("driver");
. ........
endfunction
(4)测试平台的层次结构是:
cpu_env.cpu_agent.cpu_driver
cpu_env在cpu_base_test中实例化。
2.1.2 方法
step1:
定义新类:new_cpu_bus_driver
class new_cpu_bus_driver extends cpu_bus_driver ;
........定义自己的get_tranfer, drive_bus, get_response函数
endclass
step2:
替换原有的类。
因为不能修改cpu_env及其一下各层次的代码,所以只能在testcase中进行替换:
class cpu_test1 extends cpu_base_test ;
new_cpu_bus_driver new_driver ;
......
new_driver = new("new_driver");
cpu_env.cpu_agent.cpu_driver = new_driver ;
.......
endclass
2.1.3 效果
没有修改任何cpu env及其一下层次的代码。
2.1.4 问题
(1)上面标示的蓝色粗体为关键代码,但是这个语句的执行时间点需要精确把控。
如果太早,则在运行cpu_agent.build()之后cpu_agent中的driver又会被
重置为cpu_bus_driver而不是new_cpu_bus_driver;
如果太晚,则可能cpu agent可能已经用cpu_bus_driver运行了一段时间了,
然后才会切换成new_cpu_bus_driver,这样回导致前面的错误操作。
最佳时间点显然是在所有的build phase之后,任何connection phase之前。
(2)开发testcase的人需要准确的知道cpu env的层次结构,也就是说需要知道
xxx.xxx.xxx.xxx形式,很显然这是个缺点;
(3)如果有100个cpu driver需要替换,那么就需要100次
cpu_env0.xxx.xxx.old_driver = new_driver ;
....
cpu_env99.xxx.xxx.old_driver = new_driver ;
如果你觉得这个也不是问题,因为层次结构很规整嘛;那还有更麻烦的:
old_driver被单独用到了一些地方而不是只用在了cpu agent里面,
比如 A_env.xxx.xxx.old_driver,B_env.xxx.old_driver,
C_env.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.old_driver......
那你准备怎么办?
而且这种情况下缺点(2)的影响会更恶劣! |
|