前言
测试所用的文件目录(列举关键文件):
1. /home/xiaotu/my_work/uvm_demo 2. -cfg/ 3. -ctl/ 4. -rtl/ 5. -sim/ 6. -Makefile 7. -tc/ 8. -th/ 9. -ver/
-f/-F影响后跟filelist文件内的解析方式,不影响后跟文件的解析方式
典型的场景,就是makefile里用-f还是-F来后缀路径都是一样的(仅仅对于解析这个list) ,绝对路径就按绝对路径解析,相对路径就相对makefile所在目录进行解析。
而../cfg/tb.f中的所有路径都受到到前面的-f或-F影响,如上图的解析方式时,../cfg/tb.f中无论以下哪种写法,都是按-f来解析文件路径的:
1. -F ../ctl/ctl.f 2. -f ../rtl/dut.f 3. ../rtl/a.v
-f解析filelist内的路径时,与当前filelist所在路径无关
-f ../cfg/tb.f,
当tb.f内路径为相对路径时,则相对makefile所在路径进行解析;
当tb.f内路径为绝对路径时,则直接按照绝对路径进行解析;
进一步讲,-f path/file.f中path不会以任何形式影响file.f中的文件路径解析;
-F解析filelist内的路径时,与当前filelist所在路径有关
-F ../cfg/tb.f
当tb.f内路径为相对路径时,则会前缀filelist所在路径进行解析;
1. ../cfg/cfg.f中的写法: 2. ../th/harness.sv 3. 4. cmp.log中解析的路径: 5. Parsing design file '../cfg/../th/harness.sv'
当tb.f内路径为绝对路径时,则不会前缀任何路径,直接解析绝对路径;
1. ../cfg/cfg.f中的写法: 2. /home/xiaotu/my_work/uvm_demo/ver/my_env.sv 3. 4. cmp.log中解析的路径: 5. Parsing design file '/home/xiaotu/my_work/uvm_demo/ver/my_env.sv'
当tb.f内路为-y加载的库文件时,则直接视为相对路径,前缀filelist所在路径进行解析;
1. ../cfg/cfg.f中的写法: 2. -y /home/xiaotu/my_work/uvm_demo/rtl 3. 4. cmp.log中解析的路径: 5. Warning-[LFCOR] Library file or dir cannot be opened 6. Library directory '../cfg//home/xiaotu/my_work/uvm_demo/rtl' cannot be 7. opened for reading due to 'No such file or directory', will skip it. 8. The library was specified from command line through -y or -v.
当tb.f内路为-f+filelist时,则直接视为相对路径,前缀-F的filelist所在路径进行解析;
1. Makefile中: 2. -F ../cfg/tb.f 3. 4. ../cfg/tb.f中: 5. -f /home/xiaotu/my_work/uvm_demo/cfg/dut.f 6.
编译报错:
1. Error-[P1ARGS-CANTOPN-F] Cannot open file 2. Unable to open '../cfg//home/xiaotu/my_work/uvm_demo/cfg/dut.f' due to 'No 3. such file or directory'. 4. Please fix the reason mentioned above and continue.
嵌套的场景
1. ../cfg/cfg.f内的路径: 2. -f/-F ../cfg/dut.f(层次A) 3. 4. 5. ../cfg/dut.f内的路径为: 6. -f/-F ../ctl/ctl.f(层次B) 7. 8. ../ctl/ctl.f内文件为: 9. ../ctl/my_interface.sv
-f(层次A)嵌套-f(层次B),两次解析均按照绝对路径,或相对Makefile的相对路径进行解析;
-f(层次A)嵌套-F(层次B),层次B以-f的方式解析,层次B内的文件绝对路径正常解析,相对路径则相对层次B(即../ctl/)进行解析;
Parsing design file '../cfg/../ctl/my_interface.sv'
-F(层次A)嵌套-f(层次B),-f后面负责的相对路径都相对的是-F后跟文件所在目录的相对路径
太绕了,举个具体点的例子:
1. Makefile中: 2. -F ../cfg/tb.f 3. 4. ../cfg/tb.f中: 5. -f ./dut.f 6. 7. ./dut.f中(dut.f在cfg目录): 8. ../rtl/mul_trans.v 9. -f ../ctl/ctl.f 10. 11. ../ctl/ctl.f中: 12. ../ctl/my_interface.sv
那么mul_trans.v的编译路径为:
Parsing design file '../cfg/../rtl/mul_trans.v'
../cfg —— -F ../cfg/tb.f使得tb.f内的相对路径解析都要加上前缀../cfg;
../cfg/../rtl/mul_trans.v —— -f ./dut.f因此解析dut.f内相对路径的文件时相对的是当前../cfg的路径(上一层-F的作用);
还有my_interface.sv的解析路径:
Parsing design file '../cfg/../ctl/my_interface.sv'
其形式是-F嵌套-f再嵌套-f,可以看到后面两个-f都是相对../cfg进行解析,两个-f间没有路径叠加(如上文,-f path/file.f中path不会以任何形式影响file.f中的文件路径解析);
-F(层次A)嵌套-f(层次B),-f后跟filelist内(如果该filelist被找到)的绝对路径则会编译为绝对路径
1. Makefile中: 2. -F ../cfg/tb.f 3. 4. ../cfg/tb.f中: 5. -f ../cfg/dut.f 6. 7. ../cfg/dut.f中: 8. /home/xiaotu/my_work/uvm_demo/rtl/mul_trans.v
编译结果(这一点与我之前记忆有偏差,我再查一下,目前实测的结果确实是这样的):
Parsing design file '/home/xiaotu/my_work/uvm_demo/rtl/mul_trans.v'
综合看,-F嵌套-f会影响-f对其后filelist内相对路径的解析,使用起来要异常谨慎;
-F(层次A)嵌套-F(层次B)
遵循-F层层递进的规律,略
总结
因为-F对其后递进拆解filelist的影响更大,因此个人认为还是以-f+绝对路径的方式来组织filelist是最为合理安全的。