请教一个readmemb的问题
这个$TB_HOME是变化的,也就是说每个linux的user的TB_HOME变量是独立的。
现在我用$readmemb(“xxx/dat_file.dat”,mem)
这个路径应该怎么加才好呢?
求好心人解答!
谢谢!
TB_HOME="/x/x/x"
重新定义环境变量?
或是把dat_file.dat 拷到自己的路径下
我把TB-HOME放到一个脚本里面了,run TB之前先source一下这个脚本,可是不知道怎么在verilog中把这个环境变量加入到$readmemb这个函数参数中?
试了好几种写法都报语法错误。
求解!
是不是因为:脚本中定义的环境变量属于shell,verilog源码中无法调用? 你试试在verilog源码中用define定义绝对路径呢?
或者在脚本文件中先把data file拷贝到run目录下,然后用$readmemb("./dat_file.dat", mem);
绝对路径是可以的,但是如果其他人从服务器check out下来还要再改动相关的code,所以一直想找一个好的方法。
I've tried that the following codes works with VCS.It may help.
first, add the following codes to your testbench:
- string tb_home;
- initial begin
- $value$plusargs ("tb_home=%s",tb_home);
- $readmemb({tb_home,"dat_file.dat"},mem);
- end
then, add the following parameter to run your vcs:
- vcs ........... +tb_home=${TB_HOME}
now, the ${TB_HOME} is passed to tb_home via $value$plusargs function.
这种方法确实可行!但是又有一个问题,readmemb是在initial里面操作的,top例化的instance中$test$plusarg也是在initial中运行的,两者同时并行,这样readmemb无法拿到相应的dat文件,只有readmemb先拿到环境变量才行。可是怎么来保证$test$plusarg那个initial块执行完了之后,其他initial再执行呢?或者有什么其他方法来进行这样一个操作呢?
继续求解~
谢谢大家!
呃,没怎么明白你说的情况。
不能像我给的代码那样放在1个initial里顺序执行吗?
如果真不能的话,我感觉2个initial之间可以用个信号做个标志,一边取得tb_home参数后置位标志,另一边wait到标志后执行readmemb。
目前的场景是这样的:
top.v里面例化了A,B,C,D四个module,这些module都是一些存储器的仿真模型,各个module里面有若干个initial和always块组成;
top里面把各个module的file_name利用层级关系引到在top里面,目前通过defparam将各个file-name变量附上了dat文件的绝对路径。但是如果别人checkout下来之后,还要再改一下这个路径。所以,我想找一个方法看看能否让code自动识别每个人的work home的环境变量,这样就不用再去改动defparam那些路径了。
相对路径有的人可以有的人不行,test-plusarg那个方法确实能够把环境变量吃进来,但是它必须在一个initial块中使用(这个不太确定,是不是还能用在其他地方?),但是包括子模块在内的各个initial都是并行的;如果在testplusarg所在的initial加一个信号的话,那么其他一些相关的initial都得基于这个信号进行改动。
不知道目前解决这个问题有没有好的方法?
求解中~
谢谢!
有没有一种方法让testplusarg这类code在所有code之前最先执行呢?
用延迟行吗,#
加控制信号和延迟都可以,但是其他initial都需要改动,改动量太大。每个子module都有10多个initial。
