微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请教一个readmemb的问题

请教一个readmemb的问题

时间:10-02 整理:3721RD 点击:
我在一个.v文件中用到一个$readmemb函数,系统定义了一个环境变量TB_HOME, dat_file 的路径是$TB_HOME/dat/dat_file.dat;
这个$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:

  1. string tb_home;
  2. initial begin
  3.      $value$plusargs ("tb_home=%s",tb_home);
  4.       $readmemb({tb_home,"dat_file.dat"},mem);
  5. end

复制代码


then, add the following parameter to run your vcs:

  1. 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。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top