verilator编译 更新文件的规则
在其他文件不變的前提下,如果即將生成的mk文件和已有的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進行對比,沒有任何輸出,說明前后文件時間戳完全一樣,這意味著,第二次運行的指令,沒有導致生成結果的更新!
要知道,生成的結果
而第二次沒有更新,沒有重新編譯和拷貝,證明verilator本身是有檢測機制的,不會每次無腦編譯更新。
測試2:修改mk文件
接下來,做一個新的測試。
假設,我們已經運行了指令verilator --cc --exe Top.v main.cpp,生成了相關的文件。
神奇的事情發生了!,所有的源文件,都被修改了時間戳,也就是說這些源文件都是新生成或者新拷貝的!
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,發現也是更新全部源文件,和上面一樣。
實驗5:修改obj_dir中任意一個文件
隨便修改一個文件,前后對比,發現仍然是更新全部源文件。
結論
經過這么多的測試,你就應該明白了,對于verilator的--cc --exe階段,也就是生成可執行文件之前的階段,無論你是修改命令中給出的源文件,還是修改生成之后的任意一個文件,都會導致下一次重新運行該命令的時候,全部重新編譯和更新。
注意,修改生成的文件,是指的運行VTop.mk之前的那些文件,運行make之后生成內些文件不會跟著更新,它們的更新依靠的是make規則。
應用
好了,這個在文檔沒有找到,估計只能在源碼中找了,先不管,反正測試結果就是這樣!
我們看一下,這個特性能夠讓我們有什么應用呢?
2.通過makefile來執行編譯指令,并且識別.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來指定位置和文件總結
以上是生活随笔為你收集整理的verilator编译 更新文件的规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: static in c language
- 下一篇: 帮助你成为高手的视频和资料