乐清柳市阿里巴巴做网站的,代理招商平台,wordpress制作网页教程,最版网站建设案例本文请读者【直接关闭】#xff0c;我后面的实践结果似乎和本文的实践结果不一样#xff0c;真是见鬼了#xff01;我不知道发生了什么#xff0c;还没有来得及进一步校验#xff01;
在其他文件不变的前提下#xff0c;如果即将生成的mk文件和已有的mk文件不一样#…本文请读者【直接关闭】我后面的实践结果似乎和本文的实践结果不一样真是见鬼了我不知道发生了什么还没有来得及进一步校验
在其他文件不变的前提下如果即将生成的mk文件和已有的mk文件不一样就更新全部的源文件
这个事情说起来就有点诡异了我们解释一下
我们只使用--exe完成到生成全部的源文件以及获取生成可执行文件的makefile文件这一步编译的命令保持不变例如 verilator --cc --exe Top.v main.cpp命令中提及的文件全都保持不变例如Top.v main.cpp这里的保持不变是指其时间戳保持不变对于生成的VTop.mk文件是本次测试唯一的变量我们接下来看一看
测试一不改变mk文件
假设我们已经运行了指令verilator --cc --exe Top.v main.cpp生成了相关的文件。
接下来
首先我们运行
ls obj_dir/ --full-time 1.txt把测试前的文件时间戳存储起来
total 128
-rw-rw-r-- 1 jht jht 19595 2022-04-17 11:44:49.941869470 0800 VTop___024root.cpp
-rw-rw-r-- 1 jht jht 1846 2022-04-17 11:44:49.941869470 0800 VTop___024root.h
-rw-rw-r-- 1 jht jht 11606 2022-04-17 11:44:49.941869470 0800 VTop___024root__Slow.cpp
...这里展示一小部分太多了没必要展示。
接下来我们再次运行verilator --cc --exe Top.v main.cpp然后运行ls obj_dir/ --full-time 2.txt把新的时间戳存储起来。
紧接着使用colordiff 1.txt 2.txt 进行对比没有任何输出说明前后文件时间戳完全一样这意味着第二次运行的指令没有导致生成结果的更新
要知道生成的结果
是从外面其他文件(c/cpp)拷贝过来的是编译Verilog文件生成的
而第二次没有更新没有重新编译和拷贝证明verilator本身是有检测机制的不会每次无脑编译更新。
测试2修改mk文件
接下来做一个新的测试。
假设我们已经运行了指令verilator --cc --exe Top.v main.cpp生成了相关的文件。
运行ls obj_dir/ --full-time 1.txt修改VTop.mk文件比如给其任意位置加一个注释运行sed -i 1 i # test obj_dir/VTop.mk或者手动修改该文件再次运行verilator --cc --exe Top.v main.cpp运行ls obj_dir/ --full-time 2.txt使用colordiff 1.txt 2.txt 进行对比
神奇的事情发生了所有的源文件都被修改了时间戳也就是说这些源文件都是新生成或者新拷贝的
2,16c2,16-rw-rw-r-- 1 jht jht 19595 2022-04-17 11:52:02.256126245 0800 VTop___024root.cpp-rw-rw-r-- 1 jht jht 1846 2022-04-17 11:52:02.252126217 0800 VTop___024root.h-rw-rw-r-- 1 jht jht 11606 2022-04-17 11:52:02.256126245 0800 VTop___024root__Slow.cpp
...
----rw-rw-r-- 1 jht jht 19595 2022-04-17 11:52:16.824228142 0800 VTop___024root.cpp-rw-rw-r-- 1 jht jht 1846 2022-04-17 11:52:16.824228142 0800 VTop___024root.h-rw-rw-r-- 1 jht jht 11606 2022-04-17 11:52:16.824228142 0800 VTop___024root__Slow.cpp
...这里只展示一部分事实上是所有的源文件都更新了。
另外经过测试给mk文件加个空行也可以达到该效果。
这就意味着什么呢……至少
在生成文件更新的检测机制上verilator会检测当前命令生成的mk文件和已有的mk文件是否有不同如果不同就重新生成和更新全部源文件。
实验3仅修改Verilog文件
这里同样是命令verilator --cc --exe Top.v main.cpp我们单独修改Top.v再查看前后对比结果。
发现也是全部更新源文件和上面一样。
实验4仅修改cpp文件
仅仅修改main.cpp
NOTE不会更新
因为cpp文件没有被拷贝进去而是直接编译的外面的源文件。
实验5修改obj_dir中任意一个文件(生成的源文件)
随便修改一个文件前后对比发现仍然是更新全部源文件。
结论
经过这么多的测试你就应该明白了对于verilator的--cc --exe阶段也就是生成可执行文件之前的阶段无论你是修改命令中给出的源文件指Verilog源文件c/cpp不算还是修改生成之后的任意一个文件都会导致下一次重新运行该命令的时候全部重新编译和更新。
注意修改生成的文件是指的运行VTop.mk之前的那些文件运行make之后生成内些文件不会跟着更新它们的更新依靠的是make规则。
应用
好了这个在文档没有找到估计只能在源码中找了先不管反正测试结果就是这样
我们看一下这个特性能够让我们有什么应用呢
VTop.mk文件生成VTop的规则是依赖于obj_dir文件夹中源文件的外部文件它是不管的如果你引入了外部生成的.o文件这个文件不会被放在obj_dir文件夹中只是在VTop.mk中提供外部.o文件的路径以供链接使用也就是说如果你更新了外部的.o文件按照生成规则来说verilator的不知道这件事的它会默认你的.o文件是一直不变的这就意味着你需要额外的规则来改变这件事我们的放在工程会在外部直接编译.c文件到.o文件但是verilator不知道这件事我们有两种方法 强制每次都重新编译Verilog和拷贝cpp源文件这种方式就用了我们上面提到的那个特点你只需要编译完成之后再给VTop.mk随便编辑一下下一次编译一定会全部更新的。但是这样似乎不太好…… 2.通过makefile来执行编译指令并且识别.o文件是否更新如果更新则可以 强制编译和更新源文件但是没有必要这么做毕竟其他文件又没变删除掉生成的VTop可执行文件重新进行链接即可。这种方式是可取的如果其他的都没变的话只是外部的.o文件改变只需要重新链接就可以
加粗部分是提倡采取的方案。
下面是提供的复杂工程的示例
simulate
├── csrc # c/cpp 源文件和可重定位目标文件
│ ├── build # 由 .c 文件生成.o文件提供给verilator
│ │ ├── memory
│ │ │ └── mem.o
│ │ └── monitor
│ │ ├── monitor.o
│ │ └── sdb
│ │ └── sdb.o
│ ├── include # 头文件
│ │ ├── common.h
│ │ ├── main.h
│ │ └── mem.h
│ ├── main.cpp # 提供给verilator的cpp文件
│ ├── Makefile # 生成 build 的规则
│ ├── memory # c 源文件
│ │ └── mem.c
│ ├── monitor
│ │ ├── monitor.c
│ │ └── sdb
│ │ └── sdb.c
│ └── utils
├── Makefile # verilator编译和生成规则
└── obj_dir # verilator生成目录
# 备注Verilog文件在其他路径可由verilator来指定位置和文件