mirror of
https://github.com/verilator/verilator.git
synced 2026-10-03 16:44:11 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
184f8f7920 | ||
|
|
89f0e1def0 | ||
|
|
d49697a85f | ||
|
|
c801237ce8 | ||
|
|
1d69c18e33 | ||
|
|
e089817951 | ||
|
|
d4aa00dbeb | ||
|
|
e6cdaf112c | ||
|
|
8750cdac73 | ||
|
|
2b8c9a1cff | ||
|
|
cd8af21915 | ||
|
|
782fe1daf2 | ||
|
|
5847b105a5 | ||
|
|
330b2589ed | ||
|
|
76ec35a8f6 | ||
|
|
00ac706f67 | ||
|
|
2e502aead8 | ||
|
|
e27613ed45 | ||
|
|
847de990de | ||
|
|
10935ee031 | ||
|
|
922223a9c3 | ||
|
|
08330f5fe2 | ||
|
|
884b48578d | ||
|
|
85119cb32e | ||
|
|
d81da042cd | ||
|
|
1e08c912d7 | ||
|
|
da1bca5c9b | ||
|
|
da7dd1fa16 | ||
|
|
cc910fa4c4 | ||
|
|
a4c5d2e29c | ||
|
|
2a0b331ee3 | ||
|
|
af2771e901 | ||
|
|
287fdb7312 | ||
|
|
50b89ac9b5 | ||
|
|
28dd90e92d | ||
|
|
1f04cd868c | ||
|
|
04e39168c4 | ||
|
|
ffbb3229a8 | ||
|
|
5642de432b | ||
|
|
766514bdcf | ||
|
|
b652009235 | ||
|
|
9513edfdd6 | ||
|
|
f9adc3461d | ||
|
|
1a1862352a | ||
|
|
cddbb5e095 | ||
|
|
151b17ac82 | ||
|
|
fafe3737a2 | ||
|
|
60c532908e | ||
|
|
6ec5c85bea | ||
|
|
1efec71437 | ||
|
|
f8ea1d3490 | ||
|
|
e00a919269 | ||
|
|
d236e4c054 | ||
|
|
388fc863f4 | ||
|
|
bfb20397d9 | ||
|
|
7225c902ee | ||
|
|
0ead54b17e | ||
|
|
68b227065e | ||
|
|
bd4743f420 | ||
|
|
dd76a5b8ba | ||
|
|
e21dd04159 | ||
|
|
92b490f2f7 | ||
|
|
e732f656a9 | ||
|
|
9f6719d28d | ||
|
|
c1ecddf26a | ||
|
|
d864057a60 | ||
|
|
65c5071246 | ||
|
|
cc28b07dc1 | ||
|
|
bf2422b55b | ||
|
|
d33da1ebb6 | ||
|
|
21ef11099e | ||
|
|
f9c5db907a | ||
|
|
5ac345e09c | ||
|
|
43373010dc | ||
|
|
cb3c2706a8 | ||
|
|
d65ba037a8 | ||
|
|
e00403351c | ||
|
|
6f055f84ce | ||
|
|
cc77233902 | ||
|
|
ec91158130 | ||
|
|
c471323601 | ||
|
|
8daae7336d | ||
|
|
cf275b6e58 | ||
|
|
14e3448ba6 | ||
|
|
61de46cea2 | ||
|
|
24e665f38f | ||
|
|
8f13bc0477 | ||
|
|
f73dde6dd9 | ||
|
|
ffd7ec1007 | ||
|
|
9bd30baba4 | ||
|
|
61c64e4a3b | ||
|
|
4ef6f00423 | ||
|
|
5c412e5e81 | ||
|
|
af2327aaf4 | ||
|
|
96ed725278 | ||
|
|
3d5d2db64b | ||
|
|
94525cae5d | ||
|
|
982c7fb058 | ||
|
|
794247450f | ||
|
|
0c712d7c60 | ||
|
|
cefcf836fd | ||
|
|
eb53bca6fd | ||
|
|
958d096e7f | ||
|
|
9dfc050fb5 | ||
|
|
b99b3d7b9c | ||
|
|
16fdd0e93c | ||
|
|
01157d414b | ||
|
|
eae1e5bdf2 | ||
|
|
71941cc673 | ||
|
|
fac4ed49af | ||
|
|
8785086bc8 | ||
|
|
6e8bd3da19 | ||
|
|
078275034d | ||
|
|
31e73f1645 | ||
|
|
2ac7cf51a9 | ||
|
|
4f1d8a1b15 | ||
|
|
a7f4ff7b06 | ||
|
|
3027f67b6f | ||
|
|
802ba0c2bf | ||
|
|
41b05cb1f8 | ||
|
|
3306ed146b | ||
|
|
fb4951d2df | ||
|
|
9dc0cf5a7c | ||
|
|
e63d486422 | ||
|
|
1a91ab02cf | ||
|
|
7b4ad29260 | ||
|
|
e33b24fad2 | ||
|
|
49c51af841 | ||
|
|
222a3655ba | ||
|
|
c8c53f9a18 | ||
|
|
838b8a2bec | ||
|
|
1a8f9f0483 | ||
|
|
2631af977a | ||
|
|
165622a9e9 | ||
|
|
f979e459e8 | ||
|
|
9d6f127a4e | ||
|
|
bfe39ce5bc | ||
|
|
832f41f0fe | ||
|
|
97707bdc72 | ||
|
|
888169571b | ||
|
|
d7fbea62f9 | ||
|
|
728f56e581 | ||
|
|
1268a28e7b | ||
|
|
717667034b | ||
|
|
5229ce8660 | ||
|
|
9f5d22b21f | ||
|
|
0280de11da | ||
|
|
b4d064d166 | ||
|
|
6dd52e1927 | ||
|
|
29dacd3441 | ||
|
|
540e042221 | ||
|
|
f09c30df35 | ||
|
|
a03d327e96 | ||
|
|
defe282fe8 | ||
|
|
ce0a05691b | ||
|
|
62dbbbba85 | ||
|
|
2c74765246 | ||
|
|
cb5c56dac4 | ||
|
|
0b23787d6c | ||
|
|
aaa49273cf | ||
|
|
e9c48cd1ce | ||
|
|
435e1149d5 | ||
|
|
4d518873d0 | ||
|
|
caca1fcef0 | ||
|
|
8efc9d6219 | ||
|
|
e21c4fbbb5 | ||
|
|
b902e4bcf5 | ||
|
|
c5f3192588 | ||
|
|
e04f51ebd2 | ||
|
|
283810cbf7 | ||
|
|
0640ddba80 | ||
|
|
0865bee500 | ||
|
|
202a53f4f6 | ||
|
|
09518ee207 | ||
|
|
5cd8bd0356 | ||
|
|
5247e40659 | ||
|
|
603f4c615a | ||
|
|
5c72b45975 | ||
|
|
83f4db956b | ||
|
|
bdae48f6ae | ||
|
|
7e854a9e63 | ||
|
|
98786e609a | ||
|
|
5a5c38e478 | ||
|
|
3b049ab9ee | ||
|
|
21b42c4463 | ||
|
|
ca0a679413 | ||
|
|
a7e6efb4c0 | ||
|
|
8c7c6c594a | ||
|
|
7ef3b808ea | ||
|
|
3b623dc12e | ||
|
|
89cd5417ef | ||
|
|
b3350a4f3b | ||
|
|
1761622e14 | ||
|
|
ebee20c47d | ||
|
|
500312c050 | ||
|
|
4ad1dde723 | ||
|
|
62880c125e | ||
|
|
21dbdbf69d | ||
|
|
269476df6e | ||
|
|
87224db145 | ||
|
|
aa6fbd35db | ||
|
|
c9e021924f | ||
|
|
63f5f5c328 | ||
|
|
28ee2ebb30 | ||
|
|
fd12ab3413 | ||
|
|
d972b7465a | ||
|
|
734e7a9526 | ||
|
|
90bc1daa9d | ||
|
|
4e00539308 | ||
|
|
f719d66129 | ||
|
|
800af37975 | ||
|
|
df187c4406 | ||
|
|
6f250b3f8d | ||
|
|
be0392a2b2 | ||
|
|
b794c7c8d4 | ||
|
|
e74c8372ea | ||
|
|
40ca0527db | ||
|
|
a647747260 | ||
|
|
9e664a3921 | ||
|
|
ad6379b762 | ||
|
|
e0e0fb08a5 | ||
|
|
006b45526b | ||
|
|
3dc430085d | ||
|
|
9697a5ce6d | ||
|
|
53b8a5b027 | ||
|
|
ed380f08fe | ||
|
|
9af8e76e87 | ||
|
|
af54a26b43 | ||
|
|
a4db488b02 | ||
|
|
580a843474 | ||
|
|
b237eec801 | ||
|
|
e0e8503151 | ||
|
|
19ca140165 | ||
|
|
bfc438c455 | ||
|
|
d3b085ab8a | ||
|
|
d1eda66668 | ||
|
|
50dfdcb6cc | ||
|
|
7f85d7f453 | ||
|
|
f970485e19 | ||
|
|
e5e7e844c4 | ||
|
|
4e866fd710 | ||
|
|
2a498cb670 | ||
|
|
bbcb9315f3 | ||
|
|
08be65a7dd | ||
|
|
e24f84f713 | ||
|
|
c1ac2a79db | ||
|
|
0391f113b0 | ||
|
|
d26fccaa44 | ||
|
|
46e56ca6fc | ||
|
|
92f30dd28f | ||
|
|
b85a482db0 | ||
|
|
c15489b711 | ||
|
|
7f871467bf | ||
|
|
3a039df351 | ||
|
|
542ffcca60 | ||
|
|
ed6687359b | ||
|
|
57c82b9c34 | ||
|
|
0e2f0381d0 | ||
|
|
1432bb8889 | ||
|
|
3c8b8b65d0 | ||
|
|
64dbd4abcc | ||
|
|
bee58510e7 | ||
|
|
b10c6293d9 | ||
|
|
4ab0690428 | ||
|
|
841254e9e8 | ||
|
|
d7f4dbfd13 | ||
|
|
2dbf587118 | ||
|
|
4d1eea35e1 | ||
|
|
f39d6e6108 | ||
|
|
ad530c4b08 | ||
|
|
b60ad953c4 | ||
|
|
a44907b700 | ||
|
|
c856380fac | ||
|
|
ef458be855 | ||
|
|
9187b4d552 | ||
|
|
2b3bf5f51d | ||
|
|
a8d70c6edf | ||
|
|
dca555b6d7 | ||
|
|
b11ec23891 | ||
|
|
39a9a00299 | ||
|
|
3f7d13b2cf | ||
|
|
218af5500b | ||
|
|
12c524ac06 | ||
|
|
5e4668c146 | ||
|
|
4b5e602392 | ||
|
|
a2b6aca288 | ||
|
|
b455f9b591 | ||
|
|
06c3c87f4e | ||
|
|
121193e49b | ||
|
|
d7b8ede53f | ||
|
|
e348c9c344 | ||
|
|
f7ad54b324 | ||
|
|
ff0bf0a5e3 | ||
|
|
155cd9a8d0 | ||
|
|
663a9a3add | ||
|
|
be813e96dd | ||
|
|
907047d823 | ||
|
|
62d403c060 | ||
|
|
419e775dfb | ||
|
|
1f61351e8f | ||
|
|
39fd625f0c | ||
|
|
8b7a841f09 | ||
|
|
a4656b823d | ||
|
|
1308be28fe | ||
|
|
990ee994db | ||
|
|
9a6b24fca4 | ||
|
|
f53ca6ceee | ||
|
|
04aa6ebb42 | ||
|
|
4866cfa09f | ||
|
|
56927fb955 | ||
|
|
f1396fbced | ||
|
|
57d8bb5d1f | ||
|
|
d3aab31bcf | ||
|
|
5349b51e71 | ||
|
|
1923d23cff | ||
|
|
c6b0918db5 | ||
|
|
6c69210037 | ||
|
|
7f945bf89e | ||
|
|
220a3faf7c | ||
|
|
a9f95f2f08 | ||
|
|
f8f5f8f84b | ||
|
|
f57d1255e9 | ||
|
|
1fd9f3ce92 | ||
|
|
90e20cba3d | ||
|
|
dd11d5a598 | ||
|
|
83ff8e13ba | ||
|
|
77e5bb9ec9 | ||
|
|
5ffa05fba0 | ||
|
|
0743d84bcc | ||
|
|
b45cf5960a | ||
|
|
056c3ee331 | ||
|
|
c6ffd22c45 | ||
|
|
a1167b3d55 | ||
|
|
e60f52ee0c | ||
|
|
72acb2edfd | ||
|
|
6bc48fcdb3 | ||
|
|
f67534069c | ||
|
|
4d671dc5d7 | ||
|
|
f851671c41 | ||
|
|
d186dcdc32 | ||
|
|
46f8003c4e | ||
|
|
3549fd1aa0 | ||
|
|
819625de61 | ||
|
|
aa28a8d1e1 | ||
|
|
0d1f036f17 | ||
|
|
b4a9ff4ffe | ||
|
|
f41e36b99f | ||
|
|
85454f6083 | ||
|
|
141de7b94a | ||
|
|
905c0c4f6d | ||
|
|
a364704e3a | ||
|
|
107f64e53b | ||
|
|
a966e6aa13 | ||
|
|
feea221f39 | ||
|
|
a12caa4799 | ||
|
|
63993436c9 | ||
|
|
7d3c58d21c | ||
|
|
319ab84f90 | ||
|
|
4e091a1cf1 | ||
|
|
e3acd528d8 | ||
|
|
43a03b1660 | ||
|
|
4070db9990 | ||
|
|
5f0eb007b1 | ||
|
|
bd7f6d3c19 | ||
|
|
929d2ad83a | ||
|
|
7a4049b683 | ||
|
|
e2b9cadb1d | ||
|
|
1ceda731e5 | ||
|
|
fcebac6b16 | ||
|
|
1158842b7e | ||
|
|
2a09114dc7 | ||
|
|
d95e4dc150 | ||
|
|
17f29b41c2 | ||
|
|
98c7089f5b | ||
|
|
a49334f3e4 | ||
|
|
5161cea8cd | ||
|
|
8bf2240d40 | ||
|
|
1e4ede08b6 | ||
|
|
041dad92cf | ||
|
|
4cda2c0a4e | ||
|
|
e63ed0a931 | ||
|
|
a6f26b85b3 | ||
|
|
67f26508ba | ||
|
|
33b838f139 | ||
|
|
f58b323736 | ||
|
|
37c79532fe | ||
|
|
4bf2d0d755 | ||
|
|
b3e70efa30 | ||
|
|
68ce45f203 | ||
|
|
5bdc9abd2f | ||
|
|
c03cb9d9c2 | ||
|
|
34e3892367 | ||
|
|
9953851287 | ||
|
|
c73259d2f0 | ||
|
|
8ac8c64885 | ||
|
|
7ac610a3cb | ||
|
|
2aa260a03b | ||
|
|
4eb030717a | ||
|
|
51cdf52d0f | ||
|
|
6a14facf48 | ||
|
|
7bb38d21b9 | ||
|
|
ca2c40347b | ||
|
|
b0044da8a7 | ||
|
|
3770273637 | ||
|
|
c33f2b42aa | ||
|
|
14ec6258d9 | ||
|
|
b6ecffeb60 | ||
|
|
712ff95a48 | ||
|
|
fbfd1f12dd | ||
|
|
40dda323fe | ||
|
|
91ae4c35b7 | ||
|
|
a3d7b7d779 | ||
|
|
91d138248d | ||
|
|
8868d459a2 | ||
|
|
1043a6c6be | ||
|
|
409e036eca | ||
|
|
e32108713d | ||
|
|
54efa86a6c | ||
|
|
ac21d25d43 | ||
|
|
a841a962ce | ||
|
|
5f23bf95f6 | ||
|
|
ac2859bf24 | ||
|
|
703f0d8c5d | ||
|
|
3d76bb9944 | ||
|
|
02e64f0795 | ||
|
|
c2cac8a7fd | ||
|
|
ac2a75fbb5 | ||
|
|
7affb3e580 | ||
|
|
b226be7f98 | ||
|
|
f45b811c22 | ||
|
|
ee1ab074dc | ||
|
|
a9aa2f11b8 | ||
|
|
353a2e3d20 | ||
|
|
34315a4f70 | ||
|
|
d56d1a7719 | ||
|
|
1c86ff0af2 | ||
|
|
f506aa878b | ||
|
|
b95a974ff1 | ||
|
|
b19215770b | ||
|
|
457fcc267b | ||
|
|
e202cb31d8 | ||
|
|
b96f35b8fe | ||
|
|
997d5ecdf1 | ||
|
|
631714c50a | ||
|
|
327d55d13d | ||
|
|
bd91b619ad | ||
|
|
dc5a17fea0 | ||
|
|
254eb407ff | ||
|
|
92d47ca23a | ||
|
|
67da797816 | ||
|
|
3d3462b209 | ||
|
|
11667160f2 | ||
|
|
95c8b7bb00 | ||
|
|
9b2f55ab39 | ||
|
|
f71b8e6195 | ||
|
|
d1f71f2342 | ||
|
|
a0edd4e907 | ||
|
|
636a6b8cd2 | ||
|
|
6a67c0a0e5 | ||
|
|
6b9cc8a36e | ||
|
|
0bf9fc270f | ||
|
|
c9a6d06544 | ||
|
|
c90f9e53b7 | ||
|
|
53c59e7ac7 | ||
|
|
9dc31e4556 | ||
|
|
c172cc2ab0 | ||
|
|
25d71a43a5 | ||
|
|
88046c8063 | ||
|
|
dbdf235115 | ||
|
|
eaecdf7477 | ||
|
|
f6edf26eb2 | ||
|
|
b14539569f | ||
|
|
7126293086 | ||
|
|
36c4a24661 | ||
|
|
49ca1cfdd7 | ||
|
|
48a12fb0f4 | ||
|
|
340d1aff4a | ||
|
|
000d697b51 | ||
|
|
a300bfc538 | ||
|
|
6f69c990fd | ||
|
|
d273e2cbd0 | ||
|
|
ece4469869 | ||
|
|
9c11f5e05d | ||
|
|
e753480b19 | ||
|
|
047a12cc62 | ||
|
|
75c6745868 | ||
|
|
60cbbf0ec1 | ||
|
|
762c5f573c | ||
|
|
7696b0651c | ||
|
|
e6e52dd60a | ||
|
|
eb80db9397 | ||
|
|
641dd756c0 | ||
|
|
a74a3bb689 | ||
|
|
d28436dccc | ||
|
|
3ca1c9b6dd | ||
|
|
1eccfa64b5 | ||
|
|
1d05028087 | ||
|
|
16d32cdd4a | ||
|
|
d1f851e1e1 | ||
|
|
6a225d5d00 | ||
|
|
b12b1c9658 | ||
|
|
dbb8cbece2 | ||
|
|
9ddbf5f4b8 | ||
|
|
b2388faa5e | ||
|
|
188a12f609 | ||
|
|
6bd6663dc9 | ||
|
|
5b7188fcaf | ||
|
|
dc049fdd74 | ||
|
|
218659f4e8 | ||
|
|
6c1cfc68cf | ||
|
|
fbaff52668 | ||
|
|
06c570e159 | ||
|
|
c005486acf | ||
|
|
6467351752 | ||
|
|
4bd17f0a6f | ||
|
|
870c398094 | ||
|
|
86c56e8e14 | ||
|
|
25d968b833 | ||
|
|
2c41a7bbf6 | ||
|
|
158a54a7ff | ||
|
|
8c9a4fec83 | ||
|
|
53332ae03e | ||
|
|
4a5935d248 | ||
|
|
78c9e7773a | ||
|
|
d2edab458e | ||
|
|
d415757b0e | ||
|
|
7d2b6bd921 | ||
|
|
52ac3b3a0d | ||
|
|
f106c1eaec | ||
|
|
309129ebcf | ||
|
|
deed20fb78 | ||
|
|
36577bb549 | ||
|
|
de9671d4a3 | ||
|
|
12355270b3 | ||
|
|
473d54aa95 | ||
|
|
dca504c706 | ||
|
|
7bb790f7e4 | ||
|
|
f9bdab65f0 | ||
|
|
61f4c97f40 | ||
|
|
d0f0919830 | ||
|
|
bd1ac03828 | ||
|
|
00948a45a3 | ||
|
|
5faaa7ec58 | ||
|
|
d8f1e1113a | ||
|
|
9d38e63269 | ||
|
|
9d2adf3e49 | ||
|
|
2b62f5a625 | ||
|
|
0da9f6eb03 | ||
|
|
2ff6ee9613 | ||
|
|
833c31b031 | ||
|
|
a5b0a0d9dd | ||
|
|
0bd291e6cd | ||
|
|
5c1d7f3ce9 | ||
|
|
e69df457fd | ||
|
|
47c5b220b3 | ||
|
|
64a82508f2 | ||
|
|
7c71bdf2d6 | ||
|
|
bd2cb989d1 | ||
|
|
92a4bff047 | ||
|
|
d359fffcdc | ||
|
|
55b836e25a | ||
|
|
c4b3f1e99c | ||
|
|
895b85a16e | ||
|
|
1725ee9c52 | ||
|
|
d93abd002f | ||
|
|
470f99694e | ||
|
|
f3560837ec | ||
|
|
d8dbb08a95 | ||
|
|
c2e0f496bd | ||
|
|
39a5c731ac | ||
|
|
42e1c83875 | ||
|
|
504884b7d5 | ||
|
|
94ef630490 | ||
|
|
d289934ca9 | ||
|
|
20bd80698d | ||
|
|
f1826a7c20 | ||
|
|
fa62cd3486 | ||
|
|
10ac99ac05 | ||
|
|
b408e097f6 | ||
|
|
94bebb2bcb | ||
|
|
2be257369a | ||
|
|
04c38d5b3b | ||
|
|
4882a3c827 | ||
|
|
e995646898 | ||
|
|
2287d420ee | ||
|
|
db5b2669fc | ||
|
|
460bfbf181 | ||
|
|
050e5ddb5b | ||
|
|
393f0e4acb | ||
|
|
7c5d462564 | ||
|
|
763183f067 | ||
|
|
2958a5aaae | ||
|
|
344fabf56a | ||
|
|
9f04ee68c8 | ||
|
|
b5126a6abe | ||
|
|
74d4b0c0ea | ||
|
|
7401a8a43a | ||
|
|
7646e7d89c | ||
|
|
a8dca71ed0 | ||
|
|
98b8d43a4a | ||
|
|
d419c49921 | ||
|
|
a50ea2a1a6 | ||
|
|
078bb21a89 | ||
|
|
b8b9478938 | ||
|
|
f535a73ea7 | ||
|
|
641e0e5672 | ||
|
|
9d146eae16 | ||
|
|
7d43a935bd | ||
|
|
9b99d9697f | ||
|
|
a21ecb2ab9 | ||
|
|
28808f38bb | ||
|
|
7a6775ca84 | ||
|
|
e527ff49a3 | ||
|
|
c1506deef9 | ||
|
|
87050670b4 | ||
|
|
fb1373b854 | ||
|
|
7f1011e5f7 | ||
|
|
7a32771c7e | ||
|
|
94b043d6c9 | ||
|
|
8c5ba3a0d7 | ||
|
|
826e5b0826 | ||
|
|
abd509ce53 | ||
|
|
1bf24c7eb4 | ||
|
|
1f0357ba93 | ||
|
|
db6b17fdb4 | ||
|
|
f3e109d8c5 | ||
|
|
371ac07c6f | ||
|
|
caf3522364 | ||
|
|
03e0d49d99 | ||
|
|
e2e5d9eaf1 | ||
|
|
2f199f20cf | ||
|
|
cefe1845df | ||
|
|
1044398f95 | ||
|
|
77180c4020 | ||
|
|
2fc12d951e | ||
|
|
0982260d3b | ||
|
|
58b867c39c | ||
|
|
4e8a8a0398 | ||
|
|
4dc6a31276 | ||
|
|
ce77bac99a | ||
|
|
31c279a7b3 | ||
|
|
9ad0de1efd | ||
|
|
d89df33fcd | ||
|
|
d1462f3120 | ||
|
|
9fc7143fce | ||
|
|
597b973f7b | ||
|
|
a84c5d2010 | ||
|
|
dbfbc657e1 | ||
|
|
8b3a6ba542 | ||
|
|
8ba7cec15b |
+4
-4
@@ -1,6 +1,6 @@
|
||||
---
|
||||
exclude_paths:
|
||||
- ".github/**"
|
||||
- "ci/build_verilator.sh"
|
||||
- "include/vltstd/**"
|
||||
- "nodist/fastcov.py"
|
||||
- ".github/**" #
|
||||
- "ci/build_verilator.sh" #
|
||||
- "include/vltstd/**" #
|
||||
- "nodist/fastcov.py" #
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
# DESCRIPTION: codecov.io config
|
||||
#
|
||||
# Copyright 2020-2025 by Wilson Snyder. This program is free software; you
|
||||
# can redistribute it and/or modify it under the terms of either the GNU
|
||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||
# Version 2.0.
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
####################
|
||||
# Validate:
|
||||
# curl --data-binary @.codecov.yml https://codecov.io/validate
|
||||
#
|
||||
coverage:
|
||||
precision: 2
|
||||
range: 75...100
|
||||
round: down
|
||||
status:
|
||||
project: false
|
||||
patch: false
|
||||
comment: false
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Use this to report that something isn't working as expected, and it isn't "Unsupported." (Note our contributor agreement at https://github.com/verilator/verilator/blob/master/docs/CONTRIBUTING.rst)
|
||||
title: ''
|
||||
labels: new
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Thanks for taking the time to report this.
|
||||
|
||||
Can you attach an example that shows the issue? (Must be openly licensed, completely self-contained and self-checking so can directly run what you provide. Ideally use test_regress format, see https://veripool.org/guide/latest/contributing.html?highlight=test_regress#reporting-bugs
|
||||
|
||||
What 'verilator' command line do we use to run your example?
|
||||
|
||||
What 'verilator --version' are you using? Did you try it with the git master version?
|
||||
|
||||
What OS and distribution are you using?
|
||||
|
||||
May we assist you in trying to fix this in Verilator yourself?
|
||||
|
||||
(Please avoid attaching screenshots that show text - you can convert images to text using e.g. https://ocr.space)
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Use this to request something should be supported, or a new feature added. (Note our contributor agreement at https://github.com/verilator/verilator/blob/master/docs/CONTRIBUTING.rst)
|
||||
title: ''
|
||||
labels: new
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Thanks for taking the time to report this.
|
||||
|
||||
What would you like added/supported?
|
||||
|
||||
What 'verilator --version' are you using? Did you try it with the git master version?
|
||||
|
||||
Can you attach an example that runs on other simulators? (Must be openly licensed, completely self-contained and self-checking so can directly run what you provide. Ideally use test_regress format, see https://veripool.org/guide/latest/contributing.html?highlight=test_regress#reporting-bugs
|
||||
|
||||
May we assist you in trying to fix this in Verilator yourself?
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
name: Bug or feature
|
||||
about: Use this to report that something isn't working as expected, or is a desired feature. (Note our contributor agreement at https://github.com/verilator/verilator/blob/master/docs/CONTRIBUTING.rst)
|
||||
title: ''
|
||||
labels: new
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Thanks for taking the time to report this.
|
||||
|
||||
Can you please attach an example that shows the issue or missing feature? (Must be openly licensed, completely self-contained so can directly run what you provide. Ideally use test_regress format, see https://veripool.org/guide/latest/contributing.html?highlight=test_regress#reporting-bugs)
|
||||
|
||||
What output from that test indicates it is wrong, and what is the correct or expected output? (Or, please make test self-checking if possible.)
|
||||
|
||||
What 'verilator' command line do we use to run your example?
|
||||
|
||||
What 'verilator --version' are you using? Did you try it with the git master version? Did you try it with other simulators?
|
||||
|
||||
What OS and distribution are you using?
|
||||
|
||||
May we assist you in trying to fix this in Verilator yourself?
|
||||
|
||||
(Please avoid attaching screenshots that show text - you can convert images to text using e.g. https://ocr.space)
|
||||
@@ -9,4 +9,4 @@ assignees: ''
|
||||
|
||||
How may we help - what is your question?
|
||||
|
||||
(If reporting a bug or requesting a feature please use one of the other issue templates.)
|
||||
(If reporting a bug or requesting a feature please hit BACK on your browser and use a different issue templates.)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# See https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
@@ -3,10 +3,12 @@
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: build
|
||||
name: build-test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches-ignore:
|
||||
- 'dependabot/**' # Avoid duplicates: only run the PR, not the push
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
@@ -17,72 +19,158 @@ permissions:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: repo
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.actor }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
# At most 1 job per branch. Auto cancel on pull requests and on all forks
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' || github.repository != 'verilator/verilator' }}
|
||||
|
||||
jobs:
|
||||
|
||||
build-2404-gcc:
|
||||
name: Build
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}${{ matrix.asan && ' | asan' || '' }}
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
sha: ${{ github.sha }}
|
||||
os: ${{ matrix.os }}
|
||||
os-name: linux
|
||||
cc: ${{ matrix.cc }}
|
||||
dev-asan: ${{ matrix.asan }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: ubuntu-24.04, cc: gcc}
|
||||
- {os: ubuntu-24.04, cc: gcc, asan: 0}
|
||||
|
||||
build-2404-clang:
|
||||
name: Build
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}${{ matrix.asan && ' | asan' || '' }}
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
sha: ${{ github.sha }}
|
||||
os: ${{ matrix.os }}
|
||||
os-name: linux
|
||||
cc: ${{ matrix.cc }}
|
||||
dev-asan: ${{ matrix.asan }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: ubuntu-24.04, cc: clang}
|
||||
- {os: ubuntu-24.04, cc: clang, asan: 1}
|
||||
|
||||
build-2204-gcc:
|
||||
name: Build
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}${{ matrix.asan && ' | asan' || '' }}
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
sha: ${{ github.sha }}
|
||||
os: ${{ matrix.os }}
|
||||
os-name: linux
|
||||
cc: ${{ matrix.cc }}
|
||||
dev-asan: ${{ matrix.asan }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: ubuntu-22.04, cc: gcc}
|
||||
- {os: ubuntu-22.04, cc: gcc, asan: 0}
|
||||
|
||||
build-2204-clang:
|
||||
name: Build
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}${{ matrix.asan && ' | asan' || '' }}
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
sha: ${{ github.sha }}
|
||||
os: ${{ matrix.os }}
|
||||
os-name: linux
|
||||
cc: ${{ matrix.cc }}
|
||||
dev-asan: ${{ matrix.asan }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: ubuntu-22.04, cc: clang}
|
||||
- {os: ubuntu-22.04, cc: clang, asan: 0}
|
||||
|
||||
build-osx-gcc:
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}${{ matrix.asan && ' | asan' || '' }}
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
sha: ${{ github.sha }}
|
||||
os: ${{ matrix.os }}
|
||||
os-name: osx
|
||||
cc: ${{ matrix.cc }}
|
||||
dev-asan: ${{ matrix.asan }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: macos-15, cc: gcc, asan: 0}
|
||||
|
||||
build-osx-clang:
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}${{ matrix.asan && ' | asan' || '' }}
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
sha: ${{ github.sha }}
|
||||
os: ${{ matrix.os }}
|
||||
os-name: osx
|
||||
cc: ${{ matrix.cc }}
|
||||
dev-asan: ${{ matrix.asan }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: macos-15, cc: clang, asan: 0}
|
||||
|
||||
build-windows:
|
||||
name: Build | ${{ matrix.os }} | ${{ matrix.cc }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- {os: windows-2025, cc: msvc}
|
||||
env:
|
||||
CI_OS_NAME: win
|
||||
CCACHE_COMPRESS: 1
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_LIMIT_MULTIPLE: 0.95
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
path: repo
|
||||
- name: Cache $CCACHE_DIR
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: msbuild-msvc-cmake
|
||||
- name: compile
|
||||
env:
|
||||
WIN_FLEX_BISON: ${{ github.workspace }}/.ccache
|
||||
run: ./ci/ci-win-compile.ps1
|
||||
- name: test build
|
||||
run: ./ci/ci-win-test.ps1
|
||||
- name: Zip up repository
|
||||
run: Compress-Archive -LiteralPath install -DestinationPath verilator.zip
|
||||
- name: Upload zip archive
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: ${{ github.workspace }}/repo/verilator.zip
|
||||
name: verilator-win.zip
|
||||
|
||||
test-2404-gcc:
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }}
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }} | ${{ matrix.reloc && 'reloc | ' || '' }} ${{ matrix.suite }}
|
||||
needs: build-2404-gcc
|
||||
uses: ./.github/workflows/reusable-test.yml
|
||||
with:
|
||||
archive: ${{ needs.build-2404-gcc.outputs.archive }}
|
||||
os: ${{ matrix.os }}
|
||||
cc: ${{ matrix.cc }}
|
||||
reloc: ${{ matrix.reloc }}
|
||||
suite: ${{ matrix.suite }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -97,14 +185,16 @@ jobs:
|
||||
- {os: ubuntu-24.04, cc: gcc, reloc: 0, suite: vltmt-2}
|
||||
|
||||
test-2404-clang:
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }}
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }} | ${{ matrix.reloc && 'reloc | ' || '' }} ${{ matrix.suite }}
|
||||
needs: build-2404-clang
|
||||
uses: ./.github/workflows/reusable-test.yml
|
||||
with:
|
||||
archive: ${{ needs.build-2404-clang.outputs.archive }}
|
||||
os: ${{ matrix.os }}
|
||||
cc: ${{ matrix.cc }}
|
||||
reloc: ${{ matrix.reloc }}
|
||||
suite: ${{ matrix.suite }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -119,14 +209,16 @@ jobs:
|
||||
- {os: ubuntu-24.04, cc: clang, reloc: 0, suite: vltmt-2}
|
||||
|
||||
test-2204-gcc:
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }}
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }} | ${{ matrix.reloc && 'reloc | ' || '' }} ${{ matrix.suite }}
|
||||
needs: build-2204-gcc
|
||||
uses: ./.github/workflows/reusable-test.yml
|
||||
with:
|
||||
archive: ${{ needs.build-2204-gcc.outputs.archive }}
|
||||
os: ${{ matrix.os }}
|
||||
cc: ${{ matrix.cc }}
|
||||
reloc: ${{ matrix.reloc }}
|
||||
suite: ${{ matrix.suite }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -141,14 +233,16 @@ jobs:
|
||||
- {os: ubuntu-22.04, cc: gcc, reloc: 0, suite: vltmt-2}
|
||||
|
||||
test-2204-clang:
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }}
|
||||
name: Test | ${{ matrix.os }} | ${{ matrix.cc }} | ${{ matrix.reloc && 'reloc | ' || '' }} ${{ matrix.suite }}
|
||||
needs: build-2204-clang
|
||||
uses: ./.github/workflows/reusable-test.yml
|
||||
with:
|
||||
archive: ${{ needs.build-2204-clang.outputs.archive }}
|
||||
os: ${{ matrix.os }}
|
||||
cc: ${{ matrix.cc }}
|
||||
reloc: ${{ matrix.reloc }}
|
||||
suite: ${{ matrix.suite }}
|
||||
dev-gcov: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -163,34 +257,30 @@ jobs:
|
||||
- {os: ubuntu-22.04, cc: clang, reloc: 1, suite: vltmt-2}
|
||||
|
||||
lint-py:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Lint Python
|
||||
env:
|
||||
CI_OS_NAME: linux
|
||||
CI_COMMIT: ${{ github.sha }}
|
||||
CI_BUILD_STAGE_NAME: build
|
||||
CI_RUNS_ON: ubuntu-22.04
|
||||
CCACHE_COMPRESS: 1
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_LIMIT_MULTIPLE: 0.95
|
||||
strategy:
|
||||
fail-fast: false
|
||||
uses: ./.github/workflows/reusable-lint-py.yml
|
||||
|
||||
passed:
|
||||
name: Test suite passed
|
||||
if: always()
|
||||
needs:
|
||||
- build-2404-gcc
|
||||
- build-2404-clang
|
||||
- build-2204-gcc
|
||||
- build-2204-clang
|
||||
- build-osx-gcc
|
||||
- build-osx-clang
|
||||
- build-windows
|
||||
- test-2404-gcc
|
||||
- test-2404-clang
|
||||
- test-2204-gcc
|
||||
- test-2204-clang
|
||||
- lint-py
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Decide whether the needed jobs succeeded or failed
|
||||
uses: re-actors/alls-green@release/v1
|
||||
with:
|
||||
path: repo
|
||||
|
||||
- name: Install packages for build
|
||||
run: ./ci/ci-install.bash
|
||||
|
||||
# We use specific version numbers, otherwise a Python package
|
||||
# update may add a warning and break our build
|
||||
- name: Install packages for lint
|
||||
run: sudo pip3 install pylint==3.0.2 ruff==0.1.3 clang sphinx sphinx_rtd_theme sphinxcontrib-spelling breathe ruff
|
||||
|
||||
- name: Configure
|
||||
run: autoconf && ./configure --enable-longtests --enable-ccwarn
|
||||
|
||||
- name: Lint
|
||||
run: make -k lint-py
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
@@ -5,6 +5,8 @@
|
||||
name: Contributor Agreement
|
||||
on:
|
||||
push:
|
||||
branches-ignore:
|
||||
- 'dependabot/**' # Avoid duplicates: only run the PR, not the push
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
permissions:
|
||||
@@ -14,5 +16,5 @@ jobs:
|
||||
name: "'docs/CONTRIBUTORS' was signed"
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- run: test_regress/t/t_dist_contributors.py
|
||||
|
||||
+182
-66
@@ -2,96 +2,212 @@
|
||||
# DESCRIPTION: Github actions config
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: coverage
|
||||
name: Code coverage
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 0 * * 0' # weekly
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, labeled, unlabeled]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
CI_OS_NAME: linux
|
||||
CI_COMMIT: ${{ github.sha }}
|
||||
COVERAGE: 1
|
||||
VERILATOR_ARCHIVE: verilator-coverage-${{ github.sha }}.tar.gz
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: repo
|
||||
|
||||
concurrency:
|
||||
# At most 1 job per branch. Auto cancel all but scheduled jobs
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name != 'schedule' }}
|
||||
|
||||
jobs:
|
||||
|
||||
Build:
|
||||
build:
|
||||
name: Build
|
||||
# Only run scheduled jobs if explicitly enabled for that repo (e.g.: not on forks)
|
||||
if: ${{ github.event_name != 'schedule' || vars.ENABLE_SCHEDULED_JOBS == 'true' }}
|
||||
runs-on: ubuntu-24.04
|
||||
env:
|
||||
CI_BUILD_STAGE_NAME: build
|
||||
CI_RUNS_ON: ubuntu-24.04
|
||||
steps:
|
||||
# Only run pull request jobs if labelled as needing an coverage run
|
||||
# Always run workflow dispatch jobs
|
||||
if: |
|
||||
(github.event_name == 'schedule'
|
||||
&& vars.ENABLE_SCHEDULED_JOBS == 'true') ||
|
||||
(github.event_name == 'pull_request'
|
||||
&& contains(github.event.pull_request.labels.*.name, 'pr: dev-coverage')) ||
|
||||
(github.event_name == 'workflow_dispatch')
|
||||
uses: ./.github/workflows/reusable-build.yml
|
||||
with:
|
||||
# For pull requests, build the head of the pull request branch, not the
|
||||
# merge commit, otherwise patch coverage would include the changes
|
||||
# between the root of the pull request and the target branch
|
||||
sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||
os: ubuntu-24.04
|
||||
os-name: linux
|
||||
cc: gcc
|
||||
dev-asan: 0
|
||||
dev-gcov: 1
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: repo
|
||||
|
||||
- name: Install packages for build
|
||||
run: ./ci/ci-install.bash
|
||||
|
||||
- name: Build
|
||||
run: ./ci/ci-script.bash
|
||||
|
||||
- name: Tar up repository
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: tar --posix -c -z -f ${{ env.VERILATOR_ARCHIVE }} repo
|
||||
|
||||
- name: Upload tar archive
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: ${{ github.workspace }}/${{ env.VERILATOR_ARCHIVE }}
|
||||
name: ${{ env.VERILATOR_ARCHIVE }}
|
||||
|
||||
Test:
|
||||
needs: Build
|
||||
test:
|
||||
name: Test | ${{ matrix.test }}${{ matrix.num }}
|
||||
needs: build
|
||||
uses: ./.github/workflows/reusable-test.yml
|
||||
with:
|
||||
archive: ${{ needs.build.outputs.archive }}
|
||||
os: ubuntu-24.04
|
||||
cc: gcc
|
||||
reloc: 0
|
||||
suite: ${{ matrix.test }}${{ matrix.num }}
|
||||
dev-gcov: 1
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
test: [vlt-, vltmt-]
|
||||
test: [coverage-vlt-, coverage-vltmt-]
|
||||
num: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
include:
|
||||
- {test: dist, num: ''}
|
||||
runs-on: ubuntu-24.04
|
||||
name: test-${{ matrix.test }}${{ matrix.num }}
|
||||
env:
|
||||
CI_BUILD_STAGE_NAME: test
|
||||
CI_RUNS_ON: ubuntu-24.04
|
||||
steps:
|
||||
- {test: coverage-dist, num: ''}
|
||||
|
||||
- name: Download tar archive
|
||||
uses: actions/download-artifact@v4
|
||||
publish-codecov:
|
||||
name: Publish results to codecov.io
|
||||
needs: test
|
||||
if: ${{ contains(needs.*.result, 'success') && !cancelled() }}
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Download code coverage data
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: ${{ env.VERILATOR_ARCHIVE }}
|
||||
pattern: code-coverage-*
|
||||
path: obj_coverage
|
||||
merge-multiple: true
|
||||
|
||||
- name: List files
|
||||
id: list-files
|
||||
run: |
|
||||
ls -lsha obj_coverage
|
||||
find obj_coverage -type f | paste -sd, | sed "s/^/files=/" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Upload to codecov.io
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
disable_file_fixes: true
|
||||
disable_search: true
|
||||
fail_ci_if_error: true
|
||||
files: ${{ steps.list-files.outputs.files }}
|
||||
plugins: noop
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
verbose: true
|
||||
|
||||
prepare-report:
|
||||
name: Prepare HTML report
|
||||
needs: [build, test]
|
||||
if: ${{ contains(needs.*.result, 'success') && !cancelled() }}
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
|
||||
sudo dpkg-reconfigure man-db
|
||||
sudo apt install lcov
|
||||
|
||||
- name: Download repository archive
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: ${{ needs.build.outputs.archive }}
|
||||
path: ${{ github.workspace }}
|
||||
|
||||
- name: Unpack tar archive
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: tar -x -z -f ${{ env.VERILATOR_ARCHIVE }}
|
||||
|
||||
- name: Install test dependencies
|
||||
run: ./ci/ci-install.bash
|
||||
|
||||
- name: Test
|
||||
env:
|
||||
TESTS: coverage-${{ matrix.test }}${{ matrix.num }}
|
||||
run: ./ci/ci-script.bash
|
||||
|
||||
- name: Upload coverage data to Codecov
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
- name: Unpack repository archive
|
||||
run: |
|
||||
find . -name '*.gcno' -exec rm {} \;
|
||||
./ci/codecov -v upload-process -Z --sha ${{ github.sha }} -f nodist/obj_dir/coverage/app_total.info
|
||||
tar -x -z -f ${{ needs.build.outputs.archive }}
|
||||
ls -lsha
|
||||
|
||||
- name: Download code coverage data
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: code-coverage-*
|
||||
path: repo/obj_coverage
|
||||
merge-multiple: true
|
||||
|
||||
- name: Create report
|
||||
working-directory: repo
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
ls -lsha obj_coverage
|
||||
# Combine reports from test jobs
|
||||
nodist/fastcov.py -C obj_coverage/verilator-*.info --lcov -o obj_coverage/verilator.info
|
||||
# For a PR, report patch coverage against the merge-base between the head of the PR and the target branch
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
COVERAGE_BASE=$(git rev-parse --short $(git merge-base ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }}))
|
||||
make coverage-report COVERAGE_BASE=${COVERAGE_BASE} |& tee ${{ github.workspace }}/make-coverage-report.log
|
||||
else
|
||||
make coverage-report
|
||||
fi
|
||||
# Remove data files
|
||||
rm -f obj_coverage/verilator*.info
|
||||
# Some extra work for PRs only
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
# Save PR number in report
|
||||
echo ${{ github.event.number }} > obj_coverage/pr-number.txt
|
||||
# Generate notification comment content
|
||||
mkdir -p notification
|
||||
echo ${{ github.event.number }} > notification/pr-number.txt
|
||||
NUM=$(gh run view ${{ github.run_id }} --json number --jq ".number")
|
||||
URL=$(gh run view ${{ github.run_id }} --json url --jq ".url")
|
||||
echo "Patch coverage from PR workflow [#$NUM]($URL) (code coverage of lines changed relative to ${COVERAGE_BASE}):" > notification/body.txt
|
||||
if [[ ! -f obj_coverage/empty-patch ]]; then
|
||||
echo "<pre>" >> notification/body.txt
|
||||
grep -E "(lines|branches)\.*:" ${{ github.workspace }}/make-coverage-report.log | sed "s/\.*:/:/" >> notification/body.txt || true
|
||||
echo "</pre>" >> notification/body.txt
|
||||
echo "Report: [${{ github.run_id }}](https://${{ github.repository_owner }}.github.io/verilator/coverage-reports/${{ github.run_id }}/index.html)" >> notification/body.txt
|
||||
else
|
||||
echo "Patch contains no code changes" >> notification/body.txt
|
||||
fi
|
||||
cat notification/body.txt
|
||||
fi
|
||||
|
||||
- name: Upload report
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: repo/obj_coverage
|
||||
name: coverage-report
|
||||
|
||||
- name: Upload notification
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: repo/notification
|
||||
name: coverage-pr-notification
|
||||
|
||||
# Create GitHub issue for failed scheduled jobs
|
||||
# This should always be the last job (we want an issue if anything breaks)
|
||||
create-issue:
|
||||
name: Create issue on failure
|
||||
needs: [publish-codecov, prepare-report]
|
||||
if: ${{ github.event_name == 'schedule' && github.repository == 'verilator/verilator' && github.run_attempt == 1 && failure() && !cancelled() }}
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
# Creating issues requires elevated privilege
|
||||
- name: Generate access token
|
||||
id: generate-token
|
||||
uses: actions/[email protected]
|
||||
with:
|
||||
app-id: ${{ vars.VERILATOR_CI_ID }}
|
||||
private-key: ${{ secrets.VERILATOR_CI_KEY }}
|
||||
owner: verilator
|
||||
repositories: verilator
|
||||
permission-issues: write
|
||||
- name: Create issue
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
run: |-
|
||||
echo "This issue was created automatically by the GitHub Actions CI due to the failure of a scheduled Code coverage run." >> body.txt
|
||||
echo "" >> body.txt
|
||||
echo "Workflow status: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> body.txt
|
||||
gh issue --repo ${{ github.repository }} create \
|
||||
--title "Code coverage run #${{ github.run_number }} Failed" \
|
||||
--body-file body.txt \
|
||||
--label new \
|
||||
--assignee gezalore,wsnyder
|
||||
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Extract context variables
|
||||
run: |
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
|
||||
- name: Docker meta
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@v4
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
${{ vars.DOCKER_HUB_NAMESPACE }}/${{ env.image_name }}
|
||||
@@ -64,21 +64,21 @@ jobs:
|
||||
type=raw,value=latest,enable=${{ inputs.add_latest_tag == true }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
buildkitd-flags: --debug
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USER }}
|
||||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||
|
||||
- name: Build and Push to Docker
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v6
|
||||
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
|
||||
with:
|
||||
context: ${{ env.build_context }}
|
||||
|
||||
@@ -5,21 +5,23 @@
|
||||
name: format
|
||||
on:
|
||||
push:
|
||||
pull_request_target:
|
||||
workflow_dispatch:
|
||||
branches-ignore:
|
||||
- 'dependabot/**' # Avoid duplicates: only run the PR, not the push
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
format:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Ubuntu 22.04 | format
|
||||
runs-on: ubuntu-24.04
|
||||
name: Ubuntu 24.04 | format
|
||||
env:
|
||||
CI_OS_NAME: linux
|
||||
CI_RUNS_ON: ubuntu-22.04
|
||||
CI_RUNS_ON: ubuntu-24.04
|
||||
CI_COMMIT: ${{ github.sha }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Install packages for build
|
||||
@@ -27,7 +29,7 @@ jobs:
|
||||
CI_BUILD_STAGE_NAME: build
|
||||
run: |
|
||||
bash ci/ci-install.bash &&
|
||||
sudo apt-get install clang-format-14 yapf3 &&
|
||||
sudo apt-get install clang-format-18 yapf3 &&
|
||||
sudo pip3 install gersemi mbake &&
|
||||
git config --global user.email "[email protected]" &&
|
||||
git config --global user.name "github action"
|
||||
@@ -35,10 +37,10 @@ jobs:
|
||||
run: |
|
||||
autoconf &&
|
||||
./configure &&
|
||||
make -j 2 format CLANGFORMAT=clang-format-14 &&
|
||||
make -j 2 format CLANGFORMAT=clang-format-18 &&
|
||||
git status
|
||||
- name: Push
|
||||
run: |
|
||||
run: |-
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
git commit . -m "Apply 'make format'" &&
|
||||
git push origin
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
#
|
||||
name: msbuild
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: 0 0 * * 0 # weekly
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
CI_OS_NAME: win
|
||||
CI_COMMIT: ${{ github.sha }}
|
||||
CCACHE_COMPRESS: 1
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_LIMIT_MULTIPLE: 0.95
|
||||
defaults:
|
||||
run:
|
||||
working-directory: repo
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.actor }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
jobs:
|
||||
windows:
|
||||
name: run on windows
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: repo
|
||||
- name: Cache $CCACHE_DIR
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: msbuild-msvc-cmake
|
||||
- name: compile
|
||||
env:
|
||||
WIN_FLEX_BISON: ${{ github.workspace }}/.ccache
|
||||
run: ./ci/ci-win-compile.ps1
|
||||
- name: test build
|
||||
run: ./ci/ci-win-test.ps1
|
||||
- name: Zip up repository
|
||||
run: Compress-Archive -LiteralPath install -DestinationPath verilator.zip
|
||||
- name: Upload zip archive
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: ${{ github.workspace }}/repo/verilator.zip
|
||||
name: verilator-win.zip
|
||||
@@ -0,0 +1,90 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- "ci/**"
|
||||
- ".github/workflows"
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: ["Code coverage"]
|
||||
types: [completed]
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow only one concurrent deployment, skipping runs queued between the run
|
||||
# in-progress and latest queued. However, do NOT cancel in-progress runs as we
|
||||
# want to allow these deployments to complete.
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build content
|
||||
runs-on: ubuntu-24.04
|
||||
outputs:
|
||||
coverage-pr-run-ids: ${{ steps.build.outputs.coverage-pr-run-ids }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
- name: Build pages
|
||||
id: build
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
bash -x ./ci/ci-pages.bash
|
||||
ls -lsha
|
||||
tree -L 3 pages
|
||||
- name: Upload pages artifact
|
||||
uses: actions/upload-pages-artifact@v4
|
||||
with:
|
||||
path: pages
|
||||
|
||||
deploy:
|
||||
name: Deploy
|
||||
needs: build
|
||||
runs-on: ubuntu-24.04
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: actions/deploy-pages@v4
|
||||
|
||||
notify:
|
||||
name: Notify
|
||||
needs: [build, deploy]
|
||||
runs-on: ubuntu-24.04
|
||||
if: ${{ github.repository == 'verilator/verilator' }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
# Use the Verilator CI app to post the comment
|
||||
- name: Generate access token
|
||||
id: generate-token
|
||||
uses: actions/[email protected]
|
||||
with:
|
||||
app-id: ${{ vars.VERILATOR_CI_ID }}
|
||||
private-key: ${{ secrets.VERILATOR_CI_KEY }}
|
||||
permission-actions: write
|
||||
permission-pull-requests: write
|
||||
- name: Comment on PR
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
COVERAGE_PR_RUN_IDS: ${{ needs.build.outputs.coverage-pr-run-ids }}
|
||||
run: bash -x ./ci/ci-pages-notify.bash
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: reusable-build
|
||||
@@ -8,16 +7,32 @@ name: reusable-build
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
sha:
|
||||
description: "Commit SHA to build"
|
||||
required: true
|
||||
type: string
|
||||
os: # e.g. ubuntu-24.04
|
||||
required: true
|
||||
type: string
|
||||
cc: # gcc or clang
|
||||
cc: # 'clang' or 'gcc'
|
||||
required: true
|
||||
type: string
|
||||
os-name: # 'linux' or 'osx'
|
||||
required: true
|
||||
type: string
|
||||
dev-asan:
|
||||
required: true
|
||||
type: number
|
||||
dev-gcov:
|
||||
required: true
|
||||
type: number
|
||||
outputs:
|
||||
archive:
|
||||
description: "Name of the built repository archive artifact"
|
||||
value: ${{ jobs.build.outputs.archive }}
|
||||
|
||||
env:
|
||||
CI_OS_NAME: linux
|
||||
CI_COMMIT: ${{ github.sha }}
|
||||
CI_OS_NAME: ${{ inputs.os-name }}
|
||||
CCACHE_COMPRESS: 1
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_LIMIT_MULTIPLE: 0.95
|
||||
@@ -32,22 +47,25 @@ defaults:
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ${{ inputs.os }}
|
||||
name: Sub-build | ${{ inputs.os }} | ${{ inputs.cc }}
|
||||
outputs:
|
||||
archive: ${{ steps.create-archive.outputs.archive }}
|
||||
env:
|
||||
CI_BUILD_STAGE_NAME: build
|
||||
CI_DEV_ASAN: ${{ inputs.dev-asan }}
|
||||
CI_DEV_GCOV: ${{ inputs.dev-gcov }}
|
||||
CI_RUNS_ON: ${{ inputs.os }}
|
||||
CC: ${{ inputs.cc }}
|
||||
CXX: ${{ inputs.cc == 'clang' && 'clang++' || 'g++' }}
|
||||
CACHE_BASE_KEY: build-${{ inputs.os }}-${{ inputs.cc }}
|
||||
CCACHE_MAXSIZE: 1000M # Per build matrix entry (* 5 = 5000M in total)
|
||||
VERILATOR_ARCHIVE: verilator-${{ github.sha }}-${{ inputs.os }}-${{ inputs.cc }}.tar.gz
|
||||
steps:
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: repo
|
||||
ref: ${{ inputs.sha }}
|
||||
fetch-depth: ${{ inputs.dev-gcov && '0' || '1' }} # Coverage flow needs full history
|
||||
|
||||
- name: Cache $CCACHE_DIR
|
||||
uses: actions/cache@v4
|
||||
@@ -55,7 +73,7 @@ jobs:
|
||||
CACHE_KEY: ${{ env.CACHE_BASE_KEY }}-ccache
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ env.CACHE_KEY }}-${{ github.sha }}
|
||||
key: ${{ env.CACHE_KEY }}-${{ inputs.sha }}
|
||||
restore-keys: |
|
||||
${{ env.CACHE_KEY }}-
|
||||
|
||||
@@ -65,12 +83,17 @@ jobs:
|
||||
- name: Build
|
||||
run: ./ci/ci-script.bash
|
||||
|
||||
- name: Tar up repository
|
||||
- name: Create repository archive
|
||||
id: create-archive
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: tar --posix -c -z -f ${{ env.VERILATOR_ARCHIVE }} repo
|
||||
run: |
|
||||
# Name of the archive must be unique based on the build parameters
|
||||
ARCHIVE=verilator-${{ inputs.sha }}-${{ inputs.os }}-${{ inputs.cc }}-${{ inputs.dev-asan }}-${{ inputs.dev-gcov }}.tar.gz
|
||||
tar --posix -c -z -f $ARCHIVE repo
|
||||
echo "archive=$ARCHIVE" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Upload tar archive
|
||||
uses: actions/upload-artifact@v4
|
||||
- name: Upload repository archive
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: ${{ github.workspace }}/${{ env.VERILATOR_ARCHIVE }}
|
||||
name: ${{ env.VERILATOR_ARCHIVE }}
|
||||
path: ${{ github.workspace }}/${{ steps.create-archive.outputs.archive }}
|
||||
name: ${{ steps.create-archive.outputs.archive }}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: reusable-lint-py
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
env:
|
||||
CI_OS_NAME: linux
|
||||
CI_BUILD_STAGE_NAME: build
|
||||
CI_RUNS_ON: ubuntu-22.04
|
||||
CCACHE_COMPRESS: 1
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_LIMIT_MULTIPLE: 0.95
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: repo
|
||||
|
||||
jobs:
|
||||
|
||||
lint-py:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Sub-lint | Python
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: repo
|
||||
|
||||
- name: Install packages for build
|
||||
run: ./ci/ci-install.bash
|
||||
|
||||
# We use specific version numbers, otherwise a Python package
|
||||
# update may add a warning and break our build
|
||||
- name: Install packages for lint
|
||||
run: sudo pip3 install mypy==1.18.2 pylint==3.0.2 ruff==0.1.3 clang sphinx sphinx_rtd_theme sphinxcontrib-spelling breathe ruff
|
||||
|
||||
- name: Configure
|
||||
run: autoconf && ./configure --enable-longtests --enable-ccwarn
|
||||
|
||||
- name: Lint
|
||||
run: make -k lint-py
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: reusable-rtlmeter-build
|
||||
@@ -32,6 +31,9 @@ jobs:
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
echo "path-exclude /usr/share/doc/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
echo "path-exclude /usr/share/man/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
echo "path-exclude /usr/share/info/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
sudo apt update
|
||||
sudo apt install ccache mold help2man libfl-dev libgoogle-perftools-dev libsystemc-dev
|
||||
|
||||
@@ -43,7 +45,7 @@ jobs:
|
||||
restore-keys: rtlmeter-build-ccache-${{ inputs.runs-on }}-${{ inputs.cc }}
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: repo
|
||||
fetch-depth: 0 # Required for 'git describe' used for 'verilator --version'
|
||||
@@ -66,7 +68,7 @@ jobs:
|
||||
run: tar --posix -c -z -f verilator-rtlmeter.tar.gz install
|
||||
|
||||
- name: Upload Verilator installation archive
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: verilator-rtlmeter.tar.gz
|
||||
name: verilator-rtlmeter-${{ inputs.runs-on }}-${{ inputs.cc }}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: reusable-rtlmeter-run
|
||||
@@ -8,6 +7,10 @@ name: reusable-rtlmeter-run
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
tag:
|
||||
description: "Unique identifier for storing results"
|
||||
type: string
|
||||
required: true
|
||||
runs-on:
|
||||
description: "Runner to use, e.g.: ubuntu-24.04"
|
||||
type: string
|
||||
@@ -52,11 +55,14 @@ jobs:
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
echo "path-exclude /usr/share/doc/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
echo "path-exclude /usr/share/man/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
echo "path-exclude /usr/share/info/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
sudo apt update
|
||||
sudo apt install ccache mold libfl-dev libgoogle-perftools-dev libsystemc-dev
|
||||
|
||||
- name: Download Verilator installation archive
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: verilator-rtlmeter-${{ inputs.runs-on }}-${{ inputs.cc }}
|
||||
|
||||
@@ -74,7 +80,7 @@ jobs:
|
||||
restore-keys: rtlmeter-run-ccache-${{ inputs.runs-on }}-${{ inputs.cc }}-${{ inputs.cases }}-${{ inputs.compileArgs }}
|
||||
|
||||
- name: Checkout RTLMeter
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: "verilator/rtlmeter"
|
||||
path: rtlmeter
|
||||
@@ -86,15 +92,13 @@ jobs:
|
||||
- name: Compile cases
|
||||
working-directory: rtlmeter
|
||||
run: |
|
||||
./rtlmeter run --verbose --cases='${{ inputs.cases }}' --compileArgs='${{ inputs.compileArgs }}' --executeArgs='${{ inputs.executeArgs }}' --nExecute=0
|
||||
# My YAML highlighter sucks, so I put this comment here wiht a phony closing quote mark to make it work: '
|
||||
./rtlmeter run --timeout 60 --verbose --cases='${{inputs.cases}}' --compileArgs='${{inputs.compileArgs}}' --executeArgs='${{inputs.executeArgs}}' --nExecute=0
|
||||
|
||||
- name: Execute cases
|
||||
working-directory: rtlmeter
|
||||
continue-on-error: true # Do not fail on error, so we can at leat save the successful results
|
||||
continue-on-error: true # Do not fail on error, so we can at least save the successful results
|
||||
run: |
|
||||
./rtlmeter run --verbose --cases='${{ inputs.cases }}' --compileArgs='${{ inputs.compileArgs }}' --executeArgs='${{ inputs.executeArgs }}'
|
||||
# My YAML highlighter sucks, so I put this comment here wiht a phony closing quote mark to make it work: '
|
||||
./rtlmeter run --timeout 60 --verbose --cases='${{inputs.cases}}' --compileArgs='${{inputs.compileArgs}}' --executeArgs='${{inputs.executeArgs}}'
|
||||
|
||||
- name: Collate results
|
||||
id: results
|
||||
@@ -111,15 +115,14 @@ jobs:
|
||||
./rtlmeter report --steps '*' --metrics '*' ../results-${{ steps.results.outputs.hash }}.json
|
||||
|
||||
- name: Upload results
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: results-${{ steps.results.outputs.hash }}.json
|
||||
name: rtlmeter-results-${{ steps.results.outputs.hash }}
|
||||
name: rtlmeter-${{ inputs.tag }}-results-${{ steps.results.outputs.hash }}
|
||||
overwrite: true
|
||||
retention-days: 2
|
||||
|
||||
- name: Report status
|
||||
working-directory: rtlmeter
|
||||
run: | # This will fail the job if any of the runs failed
|
||||
./rtlmeter run --verbose --cases='${{ inputs.cases }}' --compileArgs='${{ inputs.compileArgs }}' --executeArgs='${{ inputs.executeArgs }}'
|
||||
# My YAML highlighter sucks, so I put this comment here wiht a phony closing quote mark to make it work: '
|
||||
./rtlmeter run --verbose --cases='${{inputs.cases}}' --compileArgs='${{inputs.compileArgs}}' --executeArgs='${{inputs.executeArgs}}'
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: reusable-build
|
||||
name: reusable-test
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
archive:
|
||||
description: "Name of the repository archive artifact from reusable-build"
|
||||
required: true
|
||||
type: string
|
||||
os: # e.g. ubuntu-24.04
|
||||
required: true
|
||||
type: string
|
||||
@@ -20,10 +23,12 @@ on:
|
||||
suite: # e.g. dist-vlt-0
|
||||
required: true
|
||||
type: string
|
||||
dev-gcov:
|
||||
required: true
|
||||
type: number
|
||||
|
||||
env:
|
||||
CI_OS_NAME: linux
|
||||
CI_COMMIT: ${{ github.sha }}
|
||||
CCACHE_COMPRESS: 1
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_LIMIT_MULTIPLE: 0.95
|
||||
@@ -39,27 +44,27 @@ jobs:
|
||||
|
||||
test:
|
||||
runs-on: ${{ inputs.os }}
|
||||
name: Sub-test | ${{ inputs.os }} | ${{ inputs.cc }} | ${{inputs.reloc && 'reloc | ' || '' }} ${{ inputs.suite }}
|
||||
name: Test
|
||||
env:
|
||||
CI_BUILD_STAGE_NAME: test
|
||||
CI_RUNS_ON: ${{ inputs.os }}
|
||||
CI_RELOC: ${{inputs.reloc }}
|
||||
CC: ${{ inputs.cc }}
|
||||
CXX: ${{ inputs.cc == 'clang' && 'clang++' || 'g++' }}
|
||||
CACHE_BASE_KEY: test-${{ inputs.os }}-${{ inputs.cc }}-${{inputs.reloc }}-${{ inputs.suite }}
|
||||
CCACHE_MAXSIZE: 100M # Per build per suite (* 5 * 5 = 2500M in total)
|
||||
VERILATOR_ARCHIVE: verilator-${{ github.sha }}-${{ inputs.os }}-${{ inputs.cc }}.tar.gz
|
||||
steps:
|
||||
|
||||
- name: Download tar archive
|
||||
uses: actions/download-artifact@v4
|
||||
- name: Download repository archive
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: ${{ env.VERILATOR_ARCHIVE }}
|
||||
name: ${{ inputs.archive }}
|
||||
path: ${{ github.workspace }}
|
||||
|
||||
- name: Unpack tar archive
|
||||
- name: Unpack repository archive
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: tar -x -z -f ${{ env.VERILATOR_ARCHIVE }}
|
||||
run: |
|
||||
tar -x -z -f ${{ inputs.archive }}
|
||||
ls -lsha
|
||||
|
||||
- name: Cache $CCACHE_DIR
|
||||
uses: actions/cache@v4
|
||||
@@ -75,6 +80,26 @@ jobs:
|
||||
run: ./ci/ci-install.bash
|
||||
|
||||
- name: Test
|
||||
id: run-test
|
||||
continue-on-error: true
|
||||
env:
|
||||
TESTS: ${{ inputs.suite }}
|
||||
run: ./ci/ci-script.bash
|
||||
|
||||
- name: Combine code coverage data
|
||||
if: ${{ inputs.dev-gcov }}
|
||||
run: |
|
||||
make coverage-combine
|
||||
mv obj_coverage/verilator.info obj_coverage/verilator-${{ inputs.suite }}.info
|
||||
ls -lsha obj_coverage
|
||||
|
||||
- name: Upload code coverage data
|
||||
if: ${{ inputs.dev-gcov }}
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: ${{ github.workspace }}/repo/obj_coverage/verilator-${{ inputs.suite }}.info
|
||||
name: code-coverage-${{ inputs.suite }}
|
||||
|
||||
- name: Fail job if a test failed
|
||||
if: ${{ steps.run-test.outcome == 'failure' && !cancelled() }}
|
||||
run: exit 1
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
# DESCRIPTION: Github actions config
|
||||
# This name is key to badges in README.rst, so we use the name build
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
name: RTLMeter PR results
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: [RTLMeter]
|
||||
types: [completed]
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: Publish
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }}
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Download report
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: rtlmeter-pr-results
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Download PR number
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: pr-number
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Use the Verilator CI app to post the comment
|
||||
- name: Generate access token
|
||||
id: generate-token
|
||||
uses: actions/[email protected]
|
||||
with:
|
||||
app-id: ${{ vars.VERILATOR_CI_ID }}
|
||||
private-key: ${{ secrets.VERILATOR_CI_KEY }}
|
||||
permission-pull-requests: write
|
||||
- name: Comment on PR
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
run: |-
|
||||
ls -la
|
||||
cat report.txt
|
||||
gh pr --repo ${{ github.repository }} comment $(cat pr-number.txt) --body-file report.txt
|
||||
+242
-33
@@ -9,6 +9,8 @@ on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 2 * * *' # Daily, starting at 02:00 UTC
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, labeled, unlabeled]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -18,14 +20,30 @@ defaults:
|
||||
shell: bash
|
||||
|
||||
concurrency:
|
||||
group: RTLMeter
|
||||
cancel-in-progress: false
|
||||
# At most 1 job per branch. Auto cancel all but scheduled jobs
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name != 'schedule' }}
|
||||
|
||||
jobs:
|
||||
start:
|
||||
name: Start
|
||||
# Only run scheduled jobs if explicitly enabled for that repo (e.g.: not on forks)
|
||||
# Only run pull request jobs if labelled as needing an RTLMeter run
|
||||
# Always run workflow dispatch jobs
|
||||
if: |
|
||||
(github.event_name == 'schedule'
|
||||
&& vars.ENABLE_SCHEDULED_JOBS == 'true') ||
|
||||
(github.event_name == 'pull_request'
|
||||
&& contains(github.event.pull_request.labels.*.name, 'pr: rtlmeter')) ||
|
||||
(github.event_name == 'workflow_dispatch')
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Startup
|
||||
run: echo
|
||||
|
||||
build-gcc:
|
||||
name: Build GCC
|
||||
# Only run scheduled jobs if explicitly enabled for that repo (e.g.: not on forks)
|
||||
if: ${{ github.event_name != 'schedule' || vars.ENABLE_SCHEDULED_JOBS == 'true' }}
|
||||
needs: start
|
||||
uses: ./.github/workflows/reusable-rtlmeter-build.yml
|
||||
with:
|
||||
runs-on: ubuntu-24.04
|
||||
@@ -33,8 +51,7 @@ jobs:
|
||||
|
||||
build-clang:
|
||||
name: Build Clang
|
||||
# Only run scheduled jobs if explicitly enabled for that repo (e.g.: not on forks)
|
||||
if: ${{ github.event_name != 'schedule' || vars.ENABLE_SCHEDULED_JOBS == 'true' }}
|
||||
needs: start
|
||||
uses: ./.github/workflows/reusable-rtlmeter-build.yml
|
||||
with:
|
||||
runs-on: ubuntu-24.04
|
||||
@@ -45,6 +62,7 @@ jobs:
|
||||
needs: build-gcc
|
||||
uses: ./.github/workflows/reusable-rtlmeter-run.yml
|
||||
with:
|
||||
tag: gcc
|
||||
runs-on: ubuntu-24.04
|
||||
cc: gcc
|
||||
cases: ${{ matrix.cases }}
|
||||
@@ -53,9 +71,12 @@ jobs:
|
||||
executeArgs: ""
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: 2
|
||||
max-parallel: ${{ github.event == 'schedule' && 2 || 7 }}
|
||||
matrix:
|
||||
cases:
|
||||
- "BlackParrot:1x1:*"
|
||||
- "BlackParrot:2x2:*"
|
||||
- "BlackParrot:4x4:*"
|
||||
- "NVDLA:*"
|
||||
- "OpenPiton:1x1:*"
|
||||
- "OpenPiton:2x2:*"
|
||||
@@ -86,6 +107,7 @@ jobs:
|
||||
needs: build-clang
|
||||
uses: ./.github/workflows/reusable-rtlmeter-run.yml
|
||||
with:
|
||||
tag: clang
|
||||
runs-on: ubuntu-24.04
|
||||
cc: clang
|
||||
cases: ${{ matrix.cases }}
|
||||
@@ -94,9 +116,12 @@ jobs:
|
||||
executeArgs: ""
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: 2
|
||||
max-parallel: ${{ github.event == 'schedule' && 2 || 7 }}
|
||||
matrix:
|
||||
cases:
|
||||
- "BlackParrot:1x1:*"
|
||||
- "BlackParrot:2x2:*"
|
||||
- "BlackParrot:4x4:*"
|
||||
- "NVDLA:*"
|
||||
- "OpenPiton:1x1:*"
|
||||
- "OpenPiton:2x2:*"
|
||||
@@ -122,36 +147,73 @@ jobs:
|
||||
- "XuanTie-C906:*"
|
||||
- "XuanTie-C910:*"
|
||||
|
||||
run-gcc-hier:
|
||||
name: Run GCC hier | ${{ matrix.cases }}
|
||||
needs: build-gcc
|
||||
uses: ./.github/workflows/reusable-rtlmeter-run.yml
|
||||
with:
|
||||
tag: gcc-hier
|
||||
runs-on: ubuntu-24.04
|
||||
cc: gcc
|
||||
cases: ${{ matrix.cases }}
|
||||
run-name: "gcc --hierarchical"
|
||||
compileArgs: "--hierarchical"
|
||||
executeArgs: ""
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: ${{ github.event == 'schedule' && 2 || 7 }}
|
||||
matrix:
|
||||
cases:
|
||||
- "BlackParrot:1x1:* !-hier"
|
||||
- "BlackParrot:2x2:* !-hier"
|
||||
- "BlackParrot:4x4:* !-hier"
|
||||
- "NVDLA:* !-hier"
|
||||
- "OpenPiton:1x1:* !-hier"
|
||||
- "OpenPiton:2x2:* !-hier"
|
||||
- "OpenPiton:4x4:* !-hier"
|
||||
- "OpenPiton:8x8:* !-hier"
|
||||
- "OpenPiton:16x16:dhry !-hier"
|
||||
- "XuanTie-C910:* !-hier"
|
||||
|
||||
combine-results:
|
||||
name: Combine results
|
||||
needs: [run-gcc, run-clang]
|
||||
needs: [run-gcc, run-clang, run-gcc-hier]
|
||||
# Run if any of the dependencies have run, even if failed.
|
||||
# That is: do not run if all skipped, or the workflow was cancelled.
|
||||
if: ${{ (contains(needs.*.result, 'success') || contains(needs.*.result, 'failure')) && !cancelled() }}
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
tag: [gcc, clang, gcc-hier]
|
||||
steps:
|
||||
- name: Checkout RTLMeter
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: "verilator/rtlmeter"
|
||||
path: rtlmeter
|
||||
- name: Setup RTLMeter venv
|
||||
working-directory: rtlmeter
|
||||
run: make venv
|
||||
- name: Download all results
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: rtlmeter-results-*
|
||||
path: all-results-${{ github.run_id }}
|
||||
pattern: rtlmeter-${{ matrix.tag }}-results-*
|
||||
path: all-results-${{ matrix.tag }}
|
||||
merge-multiple: true
|
||||
- name: Tar up all results into single archive
|
||||
- name: Combine results
|
||||
working-directory: rtlmeter
|
||||
run: |
|
||||
# Ensure combined result directory exists in case of no results
|
||||
mkdir -p all-results-${{ github.run_id }}
|
||||
ls -la all-results-${{ github.run_id }}
|
||||
# Tar up the results directory
|
||||
tar --posix -c -z -f all-results-${{ github.run_id }}.tar.gz all-results-${{ github.run_id }}
|
||||
./rtlmeter collate ../all-results-${{ matrix.tag }}/*.json > ../all-results-${{ matrix.tag }}.json
|
||||
- name: Upload combined results
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: all-results-${{ github.run_id }}.tar.gz
|
||||
name: all-results
|
||||
path: all-results-${{ matrix.tag }}.json
|
||||
name: all-results-${{ matrix.tag }}
|
||||
overwrite: true
|
||||
retention-days: 30
|
||||
|
||||
publish-results:
|
||||
publish-scheduled-results:
|
||||
name: Publish results to verilator/verilator-rtlmeter-results
|
||||
needs: combine-results
|
||||
# Only run on scheduled builds on the main repository. We also restrict
|
||||
@@ -163,26 +225,28 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Download combined results
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: all-results
|
||||
pattern: all-results-*
|
||||
path: results
|
||||
- name: Extract combined results
|
||||
working-directory: results
|
||||
run: |
|
||||
tar xzfv all-results-${{ github.run_id }}.tar.gz
|
||||
ls -la
|
||||
merge-multiple: true
|
||||
- name: Upload published results
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: results/*.json
|
||||
name: published-results
|
||||
# Pushing to verilator/verilator-rtlmeter-results requires elevated permissions
|
||||
- name: Generate access token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v2.0.6
|
||||
uses: actions/create-github-app-token@v2.1.4
|
||||
with:
|
||||
app-id: ${{ vars.RTLMETER_RESULTS_CI_APP_ID }}
|
||||
private-key: ${{ secrets.RTLMETER_RESULTS_CI_APP_PRIVATE_KEY }}
|
||||
app-id: ${{ vars.VERILATOR_CI_ID }}
|
||||
private-key: ${{ secrets.VERILATOR_CI_KEY }}
|
||||
owner: verilator
|
||||
repositories: verilator-rtlmeter-results
|
||||
permission-contents: write
|
||||
- name: Checkout verilator-rtlmeter-results
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: "verilator/verilator-rtlmeter-results"
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
@@ -205,3 +269,148 @@ jobs:
|
||||
git add .
|
||||
git commit -m "Verilator CI: Results of 'RTLMeter' workflow run #${{ github.run_number }}"
|
||||
git push origin
|
||||
|
||||
prepare-pr-results:
|
||||
name: Prepare Pull Request results
|
||||
needs: combine-results
|
||||
if: ${{ github.event_name == 'pull_request' && github.repository == 'verilator/verilator' && contains(needs.*.result, 'success') && !cancelled() }}
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
actions: read
|
||||
steps:
|
||||
- name: Checkout RTLMeter
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: "verilator/rtlmeter"
|
||||
path: rtlmeter
|
||||
- name: Setup RTLMeter venv
|
||||
working-directory: rtlmeter
|
||||
run: make venv
|
||||
- name: Download combined results
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: all-results-*
|
||||
path: all-results
|
||||
merge-multiple: true
|
||||
- name: Get scheduled run info
|
||||
id: scheduled-info
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
ID=$(gh run --repo ${{ github.repository }} list --workflow RTLMeter --event schedule --status success --limit 1 --json databaseId --jq ".[0].databaseId")
|
||||
echo "id=$ID" >> $GITHUB_OUTPUT
|
||||
URL=$(gh run --repo ${{ github.repository }} view $ID --json url --jq ".url")
|
||||
echo "url=$URL" >> $GITHUB_OUTPUT
|
||||
NUM=$(gh run --repo ${{ github.repository }} view $ID --json number --jq ".number")
|
||||
echo "num=$NUM" >> $GITHUB_OUTPUT
|
||||
DATE=$(gh run --repo ${{ github.repository }} view $ID --json createdAt --jq ".createdAt")
|
||||
echo "date=$DATE" >> $GITHUB_OUTPUT
|
||||
- name: Download scheduled run results
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: published-results
|
||||
path: nightly-results
|
||||
run-id: ${{ steps.scheduled-info.outputs.id }}
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Compare results
|
||||
working-directory: rtlmeter
|
||||
run: |
|
||||
for tag in gcc clang gcc-hier; do
|
||||
ADATA=../nightly-results/all-results-${tag}.json
|
||||
BDATA=../all-results/all-results-${tag}.json
|
||||
touch ../verilate-${tag}.txt
|
||||
touch ../execute-${tag}.txt
|
||||
touch ../cppbuild-${tag}.txt
|
||||
if [[ ! -e $ADATA ]]; then
|
||||
continue
|
||||
fi
|
||||
./rtlmeter compare --cases '* !Example:* !*:hello' --steps "verilate" --metrics "elapsed memory" $ADATA $BDATA > ../verilate-${tag}.txt
|
||||
cat ../verilate-${tag}.txt
|
||||
./rtlmeter compare --cases '* !Example:* !*:hello' --steps "execute" --metrics "speed memory elapsed" $ADATA $BDATA > ../execute-${tag}.txt
|
||||
cat ../execute-${tag}.txt
|
||||
./rtlmeter compare --cases '* !Example:* !*:hello' --steps "cppbuild" --metrics "elapsed memory cpu codeSize" $ADATA $BDATA > ../cppbuild-${tag}.txt
|
||||
cat ../cppbuild-${tag}.txt
|
||||
done
|
||||
- name: Create report
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -x
|
||||
NUM=$(gh run --repo ${{ github.repository }} view ${{ github.run_id }} --json number --jq ".number")
|
||||
URL=$(gh run --repo ${{ github.repository }} view ${{ github.run_id }} --json url --jq ".url")
|
||||
echo -n "Performance metrics for PR workflow [#$NUM]($URL) (B) compared to scheduled run" > report.txt
|
||||
echo -n " [#${{ steps.scheduled-info.outputs.num }}](${{ steps.scheduled-info.outputs.url }}) (A)" >> report.txt
|
||||
echo " from ${{ steps.scheduled-info.outputs.date }}" >> report.txt
|
||||
for tag in gcc clang gcc-hier; do
|
||||
echo "" >> report.txt
|
||||
if [[ $tag == "gcc" ]]; then
|
||||
echo "<details open>" >> report.txt
|
||||
else
|
||||
echo "<details>" >> report.txt
|
||||
fi
|
||||
echo -n "<summary><strong><em>" >> report.txt
|
||||
jq -rj ".[0].runName" all-results/all-results-${tag}.json >> report.txt
|
||||
echo "</em></strong></summary>" >> report.txt
|
||||
awk -v RS= -v tag=${tag} '{print > sprintf("frag-%02d-verilate-%s.txt",NR,tag)}' verilate-${tag}.txt
|
||||
awk -v RS= -v tag=${tag} '{print > sprintf("frag-%02d-execute-%s.txt" ,NR,tag)}' execute-${tag}.txt
|
||||
awk -v RS= -v tag=${tag} '{print > sprintf("frag-$02d-cppbuild-%s.txt",NR,tag)}' cppbuild-${tag}.txt
|
||||
for f in $(ls -1 frag-*-verilate-${tag}.txt | sort) $(ls -1 frag-*-execute-${tag}.txt | sort) $(ls -1 frag-*-cppbuild-${tag}.txt | sort); do
|
||||
if [[ $f == frag-01-verilate-${tag}.txt || $f == frag-01-execute-${tag}.txt ]]; then
|
||||
echo "<details open>" >> report.txt
|
||||
else
|
||||
echo "<details>" >> report.txt
|
||||
fi
|
||||
echo -n "<summary>" >> report.txt
|
||||
head -n 1 $f | tr -d '\n' >> report.txt
|
||||
echo "</summary>" >> report.txt
|
||||
echo '<pre>' >> report.txt
|
||||
tail -n +2 $f >> report.txt
|
||||
echo '</pre>' >> report.txt
|
||||
echo "</details>" >> report.txt
|
||||
done
|
||||
echo "</details>" >> report.txt
|
||||
done
|
||||
cat report.txt
|
||||
- name: Upload report
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: report.txt
|
||||
name: rtlmeter-pr-results
|
||||
- name: Save PR number
|
||||
run: echo ${{ github.event.number }} > pr-number.txt
|
||||
- name: Upload PR number
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: pr-number.txt
|
||||
name: pr-number
|
||||
|
||||
# Create GitHub issue for failed scheduled jobs
|
||||
# This should always be the last job (we want an issue if anything breaks)
|
||||
create-issue:
|
||||
name: Create issue on failure
|
||||
needs: publish-scheduled-results
|
||||
if: ${{ github.event_name == 'schedule' && github.repository == 'verilator/verilator' && github.run_attempt == 1 && failure() && !cancelled() }}
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
# Creating issues requires elevated privilege
|
||||
- name: Generate access token
|
||||
id: generate-token
|
||||
uses: actions/[email protected]
|
||||
with:
|
||||
app-id: ${{ vars.VERILATOR_CI_ID }}
|
||||
private-key: ${{ secrets.VERILATOR_CI_KEY }}
|
||||
owner: verilator
|
||||
repositories: verilator
|
||||
permission-issues: write
|
||||
- name: Create issue
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
run: |-
|
||||
echo "This issue was created automatically by the GitHub Actions CI due to the failure of a scheduled RTLMeter run." >> body.txt
|
||||
echo "" >> body.txt
|
||||
echo "Workflow status: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> body.txt
|
||||
gh issue --repo ${{ github.repository }} create \
|
||||
--title "RTLMeter run #${{ github.run_number }} Failed" \
|
||||
--body-file body.txt \
|
||||
--label new \
|
||||
--assignee gezalore,wsnyder
|
||||
|
||||
@@ -44,6 +44,7 @@ verilator_coverage_bin*
|
||||
/.vscode/
|
||||
/.idea/
|
||||
/cmake-build-*/
|
||||
/obj_coverage/
|
||||
/test_regress/snapshot/
|
||||
xmverilog.*
|
||||
xrun.history
|
||||
|
||||
+7
-2
@@ -16,7 +16,7 @@ cmake_minimum_required(VERSION 3.15)
|
||||
cmake_policy(SET CMP0091 NEW) # Use MSVC_RUNTIME_LIBRARY to select the runtime
|
||||
project(
|
||||
Verilator
|
||||
VERSION 5.038
|
||||
VERSION 5.042
|
||||
HOMEPAGE_URL https://verilator.org
|
||||
LANGUAGES CXX
|
||||
)
|
||||
@@ -49,8 +49,13 @@ if(WIN32)
|
||||
if(DEFINED ENV{WIN_FLEX_BISON})
|
||||
set(WIN_FLEX_BISON "$ENV{WIN_FLEX_BISON}")
|
||||
endif()
|
||||
if(EXISTS ${WIN_FLEX_BISON})
|
||||
if(IS_DIRECTORY ${WIN_FLEX_BISON})
|
||||
list(APPEND CMAKE_PREFIX_PATH ${WIN_FLEX_BISON})
|
||||
else()
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"The path specified by WIN_FLEX_BISON environment variable is not an existing folder: ${WIN_FLEX_BISON}"
|
||||
)
|
||||
endif()
|
||||
if(NOT WIN_FLEX_BISON)
|
||||
message(
|
||||
|
||||
@@ -8,6 +8,236 @@ The changes in each Verilator version are described below. The
|
||||
contributors that suggested or implemented a given issue are shown in []. Thanks!
|
||||
|
||||
|
||||
Verilator 5.042 2025-11-02
|
||||
==========================
|
||||
|
||||
**Other:**
|
||||
|
||||
* Add HIERPARAM error on hierarchical parameter values (#1626) (#6456) (#6484) (#6587) (#6609) (#6621) (#6623). [Todd Strader] [Luca Rufer] [Paul Swirhun]
|
||||
* Add error on zero/negative unpacked dimensions (#1642). [Stefan Wallentowitz]
|
||||
* Add verilator_gantt profiling of DPI imports (#3084). [Geza Lore]
|
||||
* Add ASSIGNEQEXPR when use `=` inside expressions (#5567). [Ethan Sifferman]
|
||||
* Add error on non-packed struct randc (#5999). [Seth Pellegrino]
|
||||
* Add configure `--enable-dev-asan` to compile verilator_bin with the address sanitizer (#6404). [Geza Lore]
|
||||
* Add $(LDFLAGS) and $(LIBS) to when building shared libraries (#6425) (#6426). [Ahmed El-Mahmoudy]
|
||||
* Add IMPLICITSTATIC also on procedure variables.
|
||||
* Add FUNCTIMCTL error on function invoking task or time-controlling statements (#6385).
|
||||
* Add error on `virtual new` (#6486). [Alex Solomatnikov]
|
||||
* Add error on ranges with tristate values (#6534). [Alex Solomatnikov]
|
||||
* Add NORETURN warning on functions without return values (#6534). [Alex Solomatnikov]
|
||||
* Add `--aslr` and `--no-aslr` options.
|
||||
* Add `$cpure` (#6580). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Add `--preproc-defines`.
|
||||
* Deprecate sensitivity list on public_flat_rw attributes (#6443). [Geza Lore]
|
||||
* Deprecate clocker attribute and --clk option (#6463). [Geza Lore]
|
||||
* Deprecate '--make cmake' option (#6540). [Geza Lore]
|
||||
* Change default `--expand-limit` to 256 (#3419).
|
||||
* Change developer coverage flow and add configure `--enable-dev-gcov` (#6526). [Geza Lore]
|
||||
* Change `verilator_difftree` to return exit code 1 on mismatch, 2 on error.
|
||||
* Change default thread pool sizes to respect processor affinity (#6604). [Geza Lore]
|
||||
* Change `--preproc-comments` to be new name of `--pp-comments` option.
|
||||
* Support modports referencing clocking blocks (#4555) (#6436). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support class package reference on pattern keys (#5653). [Todd Strader]
|
||||
* Support digits in `$sscanf` field width formats (#6083). [Iztok Jeras]
|
||||
* Support pure functions in sensitivity lists (#6393). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Support simple alias statements (#6339) (#6501). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support simple cycle delay sequence expressions inside properties (#6508). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Support impure expressions in `inside` (#6562). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Support `case` impure expressions (#6563). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Support dotted access to ports of a direct hier_block instance. (#6595). [Geza Lore]
|
||||
* Improve `lint_off` to allow multiple messages and comments (#2755).
|
||||
* Improve automatic selection of logic for DFG synthesis (#6370). [Geza Lore]
|
||||
* Improve `covergroup with function sample` handling (#6387). [Jakub Wasilewski]
|
||||
* Improve DFG type system (#6390). [Geza Lore]
|
||||
* Improve DFG variable removal and temporary insertion (#6401). [Geza Lore]
|
||||
* Improve memory usage of statistics (#6513). [Geza Lore]
|
||||
* Improve conditional merging to preserve branch prediction. [Geza Lore]
|
||||
* Optimize duplicate 'if' and '?:' conditions (#3807) (#6495)
|
||||
* Optimize dead functions in more cases (#6380) (#6430). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Optimize constant folding in wide expression expansion (#6381). [Geza Lore]
|
||||
* Fix `--trace-max-width` and increase to 4096. (#2385).
|
||||
* Fix missing BLKSEQ when connecting module port to array (#2973).
|
||||
* Fix LATCH warning with CASEINCOMPLETE (#3301).
|
||||
* Fix unused parameterized class causing internal error (#4013). [Alberto Del Rio]
|
||||
* Fix false CONSTVAR error on initializers (#4992).
|
||||
* Fix hierarchical references with parameterized modules and interfaces (#5649) (#6566). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix interface exposure with `--public-depth` or `--trace-depth` (#5758).
|
||||
* Fix cell scoping performance (#6059). [Jerry Tianchen]
|
||||
* Fix hierarchical `--prof-pgo` (#6213). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix while loop hang on timing-delayed assignment (#6343) (#6354). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Fix driver analysis of partially assigned variables (#6364) (#6378). [Geza Lore]
|
||||
* Fix V3Hash MacOS ambiguity (#6350). [Lan Zongwei]
|
||||
* Fix cmake APPLE variable (#6351). [Lan Zongwei]
|
||||
* Fix randomize local after parameters applied (#6371). [Alex Solomatnikov]
|
||||
* Fix package imports not found after parameters applied (#6373). [Alex Solomatnikov]
|
||||
* Fix deep shift pattern performance (#6379) (#6420). [Geza Lore]
|
||||
* Fix COVERAGEIGN-ignored `get_inst_coverage` and other covergroup methods (#6383). [Alex Solomatnikov]
|
||||
* Fix error when modport variable is unresolved (#6386). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix resolving parameters (#6388) (#6418) (#6421) (#6438) (#6429). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix wire array with initial assignment (#6391). [Alex Solomatnikov]
|
||||
* Fix import of class with default params (#6396) (#6410) (#6413). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Fix use after free in elaboration (#6403). [Geza Lore]
|
||||
* Fix address sanitizer issues (#6406). [Geza Lore]
|
||||
* Fix timing control under fork under function (#6407). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Fix memory leaks and reduce requirements (#6411) (#6417) (#6419) (#6437) (#6439) (#6517). [Geza Lore]
|
||||
* Fix parameter implicit type from string (#6414). [Alex Solomatnikov]
|
||||
* Fix parsing for sequence expressions (#6427). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix parameterized class super functions (#6431) (#6438). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix external function declarations with class typedef references (#6433).
|
||||
* Fix internal error on out-of-bounds real array access.
|
||||
* Fix pre/post increments in assertions (#6434).
|
||||
* Fix elaboration displays with `%m` and some `%p` (#6445) (#6451). [Alex Solomatnikov]
|
||||
* Fix cast in gdbinit.py (#6447). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix false unique assertions on `else ;` (#6450). [Don Owen]
|
||||
* Fix loss of clock attribute in DFG variable removal (#6453). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix data types of method calls without parenthesis (#6457). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix segfault on unsupported PLI calls (#6458). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Fix false assertion failure on failed DFG driver tracing (#6459). [Geza Lore]
|
||||
* Fix side effects when using select (#6460). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix timeprecision backward assignment (#6469). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix splitting hierarchically referenced variables (#6475). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix Windows compilation of Verilator with spaces in the path (#6477). [Fabian Keßler-Schulz]
|
||||
* Fix PROTOTYPEMIS error on implicit logic (#6482). [Alex Solomatnikov]
|
||||
* Fix configure misdetecting C++14 (#6488) (#6515). [Thomas O'Keeffe]
|
||||
* Fix false BLKSEQ on non-edged sensitivity list (#6492). [Oron Port]
|
||||
* Fix .vlt public_flat* and others to support long identifier names (#6516). [Szymon Gizler, Antmicro Ltd.]
|
||||
* Fix always_ff on constants (#6519). [Todd Strader]
|
||||
* Fix fault on operations on uninitialized strings (#6520). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix find_index methods of associative arrays (#6525). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix parsing of `eventually[]` and property expression memory leaks (#6530). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix memory leak for unsupported `$past` (#6535). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix inconsistent force assignment (#6541). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix DFG circular driver tracing with partial assignments. [Geza Lore]
|
||||
* Fix passing typedef value as parameter (#6543) (#6547). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix indent error on quoted strings (#6544).
|
||||
* Fix incorrect nested interface-class error (#6549). [Matthew Ballance]
|
||||
* Fix std::process::get_randstate to not affect random stability (#6550) (#6565). [Aleksander Kiryk]
|
||||
* Fix exit code signal number reporting (#6554). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix `$finish` inside fork blocks (#6555). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix single element unpacked array DPI parameters. [Geza Lore]
|
||||
* Fix DFG synthesis non-determinism (#6557) (#6568). [Todd Strader]
|
||||
* Fix side effects for improved function/task/process purity (#6559). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix excessive logic replication in DFG circular driver tracing (#6561) (#6594). [Geza Lore]
|
||||
* Fix hierarchical with parameterized instances under hier block (#6572). [Geza Lore]
|
||||
* Fix segfault on type casts (#6574). [David Moberg]
|
||||
* Fix references to interfaces containing generate blocks (#6579). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix missing net type mappings in FST traces (#6582) (#6583). [Matt Stroud]
|
||||
* Fix function call expression coverage (#6589). [Todd Strader]
|
||||
* Fix V3Life eliminating assignments across timing controls (#6593) (#6596). [Geza Lore]
|
||||
* Fix incorrectly resuming process waiting on multiple events (#6597). [Geza Lore]
|
||||
* Fix `--hierarchical` with `--binary` (#6602). [Geza Lore]
|
||||
* Fix mis-ignoring virtual interface member triggers (#5116 reopened) (#6613). [Geza Lore]
|
||||
* Fix ENUMVALUE warning when overriding parameter using `-G/-pvalue` options. [Geza Lore]
|
||||
* Fix `-G` and `-pvalue` with `--hierarchical`. [Geza Lore]
|
||||
* Fix waiving messages with empty contents (#6610). [Yoshitomo KANEDA]
|
||||
* Fix constant-arrayed instance parameters (#6614). [Alex Solomatnikov]
|
||||
|
||||
|
||||
Verilator 5.040 2025-08-30
|
||||
==========================
|
||||
|
||||
**Other:**
|
||||
|
||||
* Add ENUMITEMWIDTH error, and apply to X-extended and ranged values.
|
||||
* Add NOEFFECT warning, replacing previous `foreach` error.
|
||||
* Add SPECIFYIGN warning for specify constructs that were previously silently ignored.
|
||||
* Add PARAMNODEFAULT error, for parameters without defaults.
|
||||
* Add enum base data type, wire data type, and I/O versus data declaration checking per IEEE.
|
||||
* Add PROTOTYPEMIS error on missing and mismatching prototypes (#6206) (#6207). [Alex Solomatnikov]
|
||||
* Add error when trying to assign class object to variable of non-class types (#6237). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Add ALWNEVER warning, for `always @*` that never execute (#6291).
|
||||
* Add separate coverage counters for toggles 0->1 and 1->0 (#6086). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Add error on class 'function static'.
|
||||
* Add error on force/release non-constant selects.
|
||||
* Add `-DVERILATOR=1` definition to compiler flags when using verilated.mk.
|
||||
* Support member-level triggers for virtual interfaces (#5166) (#6148). [Yilou Wang]
|
||||
* Support unassigned virtual interfaces (#5265) (#6245). [Szymon Gizler, Antmicro Ltd.]
|
||||
* Support randomization of scope variables with 'std::randomize()' (#5438) (#6185). [Yilou Wang]
|
||||
* Support disabling a fork in additional contexts (#5432 partial) (#6174) (#6183). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support bit queue streaming (#5830) (#6103). [Paul Swirhun]
|
||||
* Support `$fread` with missing start (#6125). [Iztok Jeras]
|
||||
* Support unpacked array `with` methods (#6134).
|
||||
* Support Verilog real ports as SystemC double ports (#6136) (#6158). [George Polack]
|
||||
* Support `$countones` in constraints (#6144 partial) (#6235). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support disable dotted references (#6154). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support randomize() on class member selects (#6161) (#6195). [Igor Zaworski, Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support multiple variables on RHS of a `force` assignment (#6163). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Support covergroup extends, etc., as unsupported (#6160). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Support parameter resolution of 1D unpacked array slices (#6257) (#6268). [Michael Bedford Taylor]
|
||||
* Support generic interfaces (#6272). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Support disabling a fork from within that fork (#6314). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support future sampled value functions.
|
||||
* Support simple disable within task (#6334). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support recursive constant functions.
|
||||
* Change control file `public_flat_*` and other signal attributes to support __ in names (#6140).
|
||||
* Change runtime to exit() instead of abort(), unless under +verilated+debug.
|
||||
* Change `$display("%p")` to remove space after `}`.
|
||||
* Improve `--skip-identical` to skip on identical input file contents (#6109).
|
||||
* Improve testing on FreeBSD (#6328). [Aleksander Kiryk]
|
||||
* Optimize to return memory when using -build (#6192) (#6226). [Michael B. Taylor]
|
||||
* Optimize 2 ** X to 1 << X if base is signed (#6203). [Max Wipfli]
|
||||
* Optimize more complex combinational logic in DFG (#6205) (#6209) (#6298). [Geza Lore]
|
||||
* Optimize combinational cycles through arrays in DFG (#6210). [Geza Lore]
|
||||
* Optimize variable removal in scoped DFG (#6260). [Geza Lore]
|
||||
* Optimize acyclic DFG components into the original acyclic sub-graph. (#6261). [Geza Lore]
|
||||
* Optimize multiplexers in DFG synthesis (#6331). [Geza Lore]
|
||||
* Optimize interfaces in DFG (#6332). [Geza Lore]
|
||||
* Optimize logic in non-virtual interfaces with DFG (#6347). [Geza Lore]
|
||||
* Fix loop initialization visibility outside loop (#4237).
|
||||
* Fix constructor parameters in inheritance hierarchies (#6036) (#6070). [Petr Nohavica]
|
||||
* Fix replicate of negative giving 'REPLICATE has no expected width' internal error (#6048) (#6229).
|
||||
* Fix cmake `-Wno` compiler flag testing (#6145). [Martin Stadler]
|
||||
* Fix class extends dotted error (#6162). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix genvar error with `-O0` (#6165). [Max Wipfli]
|
||||
* Fix uninitialized thread PGO counters (#6167). [Bartłomiej Chmiel, Antmicro Ltd.]
|
||||
* Fix additional UNOPTFLAT combinational cycles automatically in DFG (#6168) (#6173) (#6176). [Geza Lore]
|
||||
* Fix omitting error when assigning to an input (#6169). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix parameter-dependent type linking (#6170). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix param-dependent class typedef linking (#6171). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix virtual interface member propagation (#6175) (#6184). [Yilou Wang]
|
||||
* Fix `--coverage-expr` null pointer dereference (#6181). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix conflicting function/class name linking error (#6182). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix negate of wide structure selections (#6186).
|
||||
* Fix VPI signal range order (#6189) (#6200). [Ibrahim Burak Yorulmaz]
|
||||
* Fix structure select causing 'Wide Op' error (#6191). [Danny Oler]
|
||||
* Fix automatic task variables in unrolled loops with forks (#6194) (#6201). [Danny Oler]
|
||||
* Fix 'driver same component' assertion (#6211) (#6215). [Geza Lore]
|
||||
* Fix `--stats` overridden by skipping identical build (#6220). [Geza Lore]
|
||||
* Fix MODDUP with duplicate packages to take first package (#6222).
|
||||
* Fix replicate with unsigned count but MSB set (#6231) (#6233). [Geza Lore]
|
||||
* Fix randomize on function-local variable (#6234).
|
||||
* Fix queue typedef with unbounded slice (#6236).
|
||||
* Fix error when force assignment is used with ref function args (#6244). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix write of 0 in '%c' (#6248) (#6249). [Rodrigo Batista de Moraes]
|
||||
* Fix coverage of variables of complex types (#6250). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Fix broken support of unassigned virtual interfaces (#6253) (#6338). [Szymon Gizler, Antmicro Ltd.]
|
||||
* Fix partial DFG conversion of concat assignments (#6255). [Geza Lore]
|
||||
* Fix dynamic cast purity (#6267). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix same variable on the RHS forced to two different LHSs. (#6269). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix spurious VPI value change callbacks (#6274). [Todd Strader]
|
||||
* Fix stray ']' in Verilog code output for non-constant select (#6277). [Geza Lore]
|
||||
* Fix hierarchical NBAs (#6286) (#6300). [Geza Lore]
|
||||
* Fix variables hiding package imports (#6289). [Johan Wouters]
|
||||
* Fix DFG circular driver tracing. [Geza Lore]
|
||||
* Fix no matching function calls for randomized `VlWide` in unpacked and dynamic arrays (#6290). [Mateusz Gancarz, Antmicro Ltd.]
|
||||
* Fix PowerPC support (#6292). [Sergey Fedorov]
|
||||
* Fix referencing module variables above classes (#6304). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix direct NBA to dynamically-sized variable (#6310). [Artur Bieniek, Antmicro Ltd.]
|
||||
* Fix static vars under member select (#6313). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix expression type comparison (#6316). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix of inline constraints with member selects (#6321). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix corner case bugs in module and variable inlining (#6322). [Geza Lore]
|
||||
* Fix queue extend to check bounds (#6324). [Aleksander Kiryk]
|
||||
* Fix gathering sensitivities from virtual interface members (#6325). [Aleksander Kiryk]
|
||||
* Fix FreeBSD missing headers (#6326). [Aleksander Kiryk]
|
||||
* Fix to select UDPs when they are the only candidate for a top module.
|
||||
* Fix splitting of assignments to SC variables (#6329) (#6336). [Geza Lore]
|
||||
* Fix to localize for super constructors with function calls as arguments (#6330). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix wide select expansion and substitution (#6341) (#6345). [Geza Lore]
|
||||
* Fix upcasting class type parameters (#6344). [Krzysztof Bieganski, Antmicro Ltd.]
|
||||
* Fix undefined weak link for Apple GCC etc (#6348). [Congcong Cai]
|
||||
|
||||
|
||||
Verilator 5.038 2025-07-08
|
||||
==========================
|
||||
|
||||
@@ -19,6 +249,7 @@ Verilator 5.038 2025-07-08
|
||||
|
||||
* Support redeclaring type as non-type; major parsing change (#2412) (#6020) (#6042) (#6044).
|
||||
* Support scoped `new` (#4199).
|
||||
* Support elaboration-time printing of unpacked array with `%p` (#4732).
|
||||
* Support constrained random for associative arrays (#5985) (#5986). [Yilou Wang]
|
||||
* Support assignments to concatenations with impure RHS (#6002). [Ryszard Rozak, Antmicro Ltd.]
|
||||
* Support SARIF JSON diagnostic output with `--diagnostics-sarif`. (#6017)
|
||||
@@ -96,7 +327,9 @@ Verilator 5.038 2025-07-08
|
||||
* Fix wide non-blocking assignment mis-optimization (#6150) (#6152) (#6155). [Todd Strader]
|
||||
* Fix interface array connections with non-zero low declaration index.
|
||||
* Fix developer build error on MacOS/Flex2.6.4 (#6153). [Paul Swirhun]
|
||||
* Fix crash with --dumpi-V3LinkDot without --debug (#6159). [Igor Zaworski]
|
||||
* Fix crash with --dumpi-V3LinkDot without --debug (#6159). [Igor Zaworski, Antmicro Ltd.]
|
||||
* Fix dereferencing stale iterator in DfgVertex::scopep() (#6225) (#6227). [Geza Lore]
|
||||
* Fix component numbers of new Vertices in V3DfgBreakCycles (#6225) (#6228). [Geza Lore]
|
||||
|
||||
|
||||
Verilator 5.036 2025-04-27
|
||||
@@ -107,7 +340,7 @@ Verilator 5.036 2025-04-27
|
||||
* Change `--output-groups` to default to value of `--build-jobs` (#5751).
|
||||
Those using build farms may need to now use `--output-groups 0` or otherwise.
|
||||
* Support user-defined primitives (UDPs) (#468) (#5807) (#5936). [Zhou Shen, Krzysztof Sychla, et al]
|
||||
* Add `--trace-saif` for SAIF power traces (#5812) (#5914). [Mateusz Gancarz]
|
||||
* Add `--trace-saif` for SAIF power traces (#5812) (#5914). [Mateusz Gancarz, Antmicro Ltd.]
|
||||
|
||||
**Other:**
|
||||
|
||||
@@ -835,7 +1068,7 @@ Verilator 5.016 2023-09-16
|
||||
* Fix nested assignments on the LHS (#4435). [Ryszard Rozak, Antmicro Ltd]
|
||||
* Fix false MULTITOP on bound interfaces (#4438). [Alex Solomatnikov]
|
||||
* Fix internal error on real conversion (#4447). [vdhotre-ventana]
|
||||
* Fix lifetime unknown error on enum.name (#4448). [jwoutersymatra]
|
||||
* Fix lifetime unknown error on enum.name (#4448). [Johan Wouters]
|
||||
* Fix unstable output of VHashSha256 (#4453). [Anthony Donlon]
|
||||
* Fix static cast from a stream type (#4469) (#4485). [Ryszard Rozak, Antmicro Ltd]
|
||||
* Fix error on enum with VARHIDDEN of cell (#4482). [Michail Rontionov]
|
||||
|
||||
+209
-57
@@ -91,6 +91,7 @@ datarootdir = @datarootdir@
|
||||
# Compile options
|
||||
CFG_WITH_CCWARN = @CFG_WITH_CCWARN@
|
||||
CFG_WITH_DEFENV = @CFG_WITH_DEFENV@
|
||||
CFG_WITH_DEV_GCOV = @CFG_WITH_DEV_GCOV@
|
||||
CFG_WITH_LONGTESTS = @CFG_WITH_LONGTESTS@
|
||||
CFG_WITH_SOLVER = @CFG_WITH_SOLVER@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
@@ -185,7 +186,7 @@ test-snap test-diff:
|
||||
|
||||
examples: all_nomsg
|
||||
for p in $(EXAMPLES) ; do \
|
||||
$(MAKE) -C $$p VERILATOR_ROOT=`pwd` || exit 10; \
|
||||
$(MAKE) -C $$p VERILATOR_ROOT=`pwd` || exit 10; \
|
||||
done
|
||||
|
||||
######################################################################
|
||||
@@ -275,7 +276,7 @@ mkbindirs:
|
||||
installbin: | mkbindirs
|
||||
cd $(srcdir)/bin; \
|
||||
for p in $(VL_INST_PUBLIC_SCRIPT_FILES) ; do \
|
||||
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \
|
||||
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \
|
||||
done
|
||||
perl -p -i -e 'use File::Spec;' \
|
||||
-e' $$path = File::Spec->abs2rel("$(realpath $(DESTDIR)$(pkgdatadir))", "$(realpath $(DESTDIR)$(bindir))");' \
|
||||
@@ -283,11 +284,11 @@ installbin: | mkbindirs
|
||||
-- "$(DESTDIR)/$(bindir)/verilator"
|
||||
cd bin; \
|
||||
for p in $(VL_INST_PUBLIC_BIN_FILES) ; do \
|
||||
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \
|
||||
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \
|
||||
done
|
||||
cd $(srcdir)/bin; \
|
||||
for p in $(VL_INST_PRIVATE_SCRIPT_FILES) ; do \
|
||||
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkgdatadir)/bin/$$p; \
|
||||
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkgdatadir)/bin/$$p; \
|
||||
done
|
||||
|
||||
installredirect: installbin | mkbindirs
|
||||
@@ -297,7 +298,7 @@ installredirect: installbin | mkbindirs
|
||||
-e 's/RELPATH.*/"$$path";/g' -- "${srcdir}/bin/redirect.tmp"
|
||||
cd $(srcdir)/bin; \
|
||||
for p in $(VL_INST_PUBLIC_SCRIPT_FILES) $(VL_INST_PUBLIC_BIN_FILES) ; do \
|
||||
$(INSTALL_PROGRAM) redirect.tmp $(DESTDIR)$(pkgdatadir)/bin/$$p; \
|
||||
$(INSTALL_PROGRAM) redirect.tmp $(DESTDIR)$(pkgdatadir)/bin/$$p; \
|
||||
done
|
||||
rm ${srcdir}/bin/redirect.tmp
|
||||
|
||||
@@ -306,14 +307,14 @@ installredirect: installbin | mkbindirs
|
||||
installman: $(VL_INST_MAN_FILES)
|
||||
$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1
|
||||
for p in $^ ; do \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(mandir)/man1/$$p; \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(mandir)/man1/$$p; \
|
||||
done
|
||||
|
||||
installdata:
|
||||
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/include/gtkwave
|
||||
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/include/vltstd
|
||||
for p in $(VL_INST_INC_BLDDIR_FILES) ; do \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
|
||||
done
|
||||
cd $(srcdir) \
|
||||
; for p in $(VL_INST_INC_SRCDIR_FILES) ; do \
|
||||
@@ -392,53 +393,50 @@ install-msg:
|
||||
######################################################################
|
||||
# Format/Lint
|
||||
|
||||
# Use --xml flag to see the cppcheck code to use for suppression
|
||||
CPPCHECK1_CPP = $(wildcard $(srcdir)/include/*.cpp)
|
||||
CPPCHECK2_CPP = $(wildcard $(srcdir)/examples/*/*.cpp)
|
||||
CPPCHECK3_CPP = $(wildcard $(srcdir)/src/Vlc*.cpp)
|
||||
CPPCHECK4_CPP = $(wildcard $(srcdir)/src/V3[A-D]*.cpp $(srcdir)/src/Verilator*.cpp)
|
||||
CPPCHECK5_CPP = $(wildcard $(srcdir)/src/V3[E-I]*.cpp)
|
||||
CPPCHECK6_CPP = $(wildcard $(srcdir)/src/V3[P-Z]*.cpp)
|
||||
CPPCHECK7_CPP = $(wildcard $(srcdir)/src/V3[L-R]*.cpp)
|
||||
CPPCHECK8_CPP = $(wildcard $(srcdir)/src/V3[S-Z]*.cpp)
|
||||
CHECK_CPP = $(CPPCHECK1_CPP) $(CPPCHECK2_CPP) $(CPPCHECK3_CPP) $(CPPCHECK4_CPP) \
|
||||
$(CPPCHECK5_CPP) $(CPPCHECK6_CPP) $(CPPCHECK7_CPP) $(CPPCHECK8_CPP)
|
||||
CPPCHECK_VERILATOR_CPP = $(wildcard $(srcdir)/src/V3*.cpp $(srcdir)/src/Verilator*.cpp)
|
||||
CPPCHECK_RUNTIME_CPP = $(wildcard $(srcdir)/include/*.cpp)
|
||||
CPPCHECK_VLC_CPP = $(wildcard $(srcdir)/src/Vlc*.cpp)
|
||||
CPPCHECK_EXAMPLES_CPP = $(wildcard $(srcdir)/examples/*/*.cpp)
|
||||
CHECK_CPP = $(CPPCHECK_VERILATOR_CPP) $(CPPCHECK_RUNTIME_CPP) $(CPPCHECK_VLC_CPP) $(CPPCHECK_EXAMPLES_CPP)
|
||||
CHECK_H = $(wildcard \
|
||||
$(srcdir)/include/*.h \
|
||||
$(srcdir)/src/*.h )
|
||||
CHECK_YL = $(wildcard \
|
||||
$(srcdir)/src/*.y \
|
||||
$(srcdir)/src/*.l )
|
||||
CPPCHECK = src/cppcheck_filtered cppcheck
|
||||
CPPCHECK_FLAGS = --enable=all --inline-suppr \
|
||||
--suppress=cstyleCast --suppress=ctunullpointer \
|
||||
--suppress=derefInvalidIteratorRedundantCheck \
|
||||
--suppress=nullPointer --suppress=nullPointerRedundantCheck \
|
||||
--suppress=templateRecursion \
|
||||
--suppress=unusedFunction --suppress=unusedScopedObject \
|
||||
--suppress=useInitializationList --suppress=useStlAlgorithm \
|
||||
CPPCHECK = cppcheck
|
||||
CPPCHECK_JOBS = $(shell nproc)
|
||||
CPPCHECK_CACHE = $(srcdir)/src/obj_dbg/cppcheck-cache
|
||||
CPPCHECK_FLAGS = --enable=all
|
||||
CPPCHECK_FLAGS += --inline-suppr
|
||||
CPPCHECK_FLAGS += --suppressions-list=$(srcdir)/src/cppcheck-suppressions.txt
|
||||
CPPCHECK_FLAGS += --cppcheck-build-dir=$(CPPCHECK_CACHE)
|
||||
CPPCHECK_FLAGS += -DVL_DEBUG=1 -DVL_CPPCHECK=1 -DINFILTER_PIPE=1 -D__GNUC__=1
|
||||
CPPCHECK_FLAGS += -j$(CPPCHECK_JOBS)
|
||||
CPPCHECK_INC = -I$(srcdir)/include
|
||||
CPPCHECK_INC += -I$(srcdir)/include/gtkwave
|
||||
CPPCHECK_INC += -I$(srcdir)/include/vltstd
|
||||
CPPCHECK_INC += -I$(srcdir)/src/obj_dbg
|
||||
CPPCHECK_INC += -I$(srcdir)/src
|
||||
|
||||
CPPCHECK_FLAGS += --xml
|
||||
CPPCHECK_DEP = $(subst .cpp,.cppcheck,$(CHECK_CPP))
|
||||
CPPCHECK_INC = -I$(srcdir)/include -I$(srcdir)/include/gtkwave -I$(srcdir)/include/vltstd -I$(srcdir)/src/obj_dbg -I$(srcdir)/src
|
||||
$(CPPCHECK_CACHE): $(CHECK_CPP) $(CHECK_H) $(CHECK_YL)
|
||||
/bin/rm -rf $@
|
||||
/bin/mkdir -p $@
|
||||
|
||||
cppcheck: cppcheck-1 cppcheck-2 cppcheck-3 cppcheck-4 cppcheck-5 cppcheck-6 cppcheck-7 cppcheck-8
|
||||
cppcheck-1:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK1_CPP)
|
||||
cppcheck-2:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK2_CPP)
|
||||
cppcheck-3:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK3_CPP)
|
||||
cppcheck-4:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK4_CPP)
|
||||
cppcheck-5:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK5_CPP)
|
||||
cppcheck-6:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK6_CPP)
|
||||
cppcheck-7:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK7_CPP)
|
||||
cppcheck-8:
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $(CPPCHECK8_CPP)
|
||||
cppcheck-verilator: | $(CPPCHECK_CACHE)
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_INC) $(CPPCHECK_VERILATOR_CPP)
|
||||
cppcheck-runtime: | $(CPPCHECK_CACHE)
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_INC) $(CPPCHECK_RUNTIME_CPP)
|
||||
cppcheck-vlc: | $(CPPCHECK_CACHE)
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_INC) $(CPPCHECK_VLC_CPP)
|
||||
cppcheck-examples: | $(CPPCHECK_CACHE)
|
||||
$(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_INC) $(CPPCHECK_EXAMPLES_CPP)
|
||||
|
||||
cppcheck:
|
||||
$(MAKE) cppcheck-vlc
|
||||
$(MAKE) cppcheck-examples
|
||||
$(MAKE) cppcheck-runtime
|
||||
$(MAKE) cppcheck-verilator
|
||||
|
||||
CLANGTIDY = clang-tidy
|
||||
CLANGTIDY_FLAGS = -config='' \
|
||||
@@ -465,16 +463,17 @@ analyzer-include:
|
||||
format:
|
||||
$(MAKE) -j 5 format-c format-cmake format-exec format-py
|
||||
|
||||
CLANGFORMAT = clang-format-14
|
||||
CLANGFORMAT = clang-format-18
|
||||
CLANGFORMAT_FLAGS = -i
|
||||
CLANGFORMAT_FILES = $(CHECK_CPP) $(CHECK_H) $(CHECK_YL) test_regress/t/*.c* test_regress/t/*.h
|
||||
|
||||
format-c clang-format:
|
||||
@$(CLANGFORMAT) --version | egrep 14.0 > /dev/null \
|
||||
|| echo "*** You are not using clang-format-14, indents may differ from master's ***"
|
||||
$(CLANGFORMAT) --version
|
||||
@$(CLANGFORMAT) --version | fgrep 'version 18' > /dev/null \
|
||||
|| echo "*** You are not using clang-format-18, indents may differ from master's ***"
|
||||
$(CLANGFORMAT) $(CLANGFORMAT_FLAGS) $(CLANGFORMAT_FILES)
|
||||
|
||||
YAMLFIX = YAMLFIX_WHITELINES=1 YAMLFIX_LINE_LENGTH=130 YAMLFIX_preserve_quotes=true yamlfix
|
||||
YAMLFIX = YAMLFIX_WHITELINES=1 YAMLFIX_LINE_LENGTH=200 YAMLFIX_preserve_quotes=true yamlfix
|
||||
|
||||
yamlfix:
|
||||
$(YAMLFIX) .
|
||||
@@ -511,14 +510,12 @@ PY_PROGRAMS = \
|
||||
src/astgen \
|
||||
src/bisonpre \
|
||||
src/config_rev \
|
||||
src/cppcheck_filtered \
|
||||
src/flexfix \
|
||||
src/vlcovgen \
|
||||
src/.gdbinit.py \
|
||||
test_regress/*.py \
|
||||
test_regress/t/*.pf \
|
||||
nodist/clang_check_attributes \
|
||||
nodist/code_coverage \
|
||||
nodist/dot_importer \
|
||||
nodist/fuzzer/actual_fail \
|
||||
nodist/fuzzer/generate_dictionary \
|
||||
@@ -528,7 +525,6 @@ PY_PROGRAMS = \
|
||||
# Python files, subject to format but not lint
|
||||
PY_FILES = \
|
||||
$(PY_PROGRAMS) \
|
||||
nodist/code_coverage.dat \
|
||||
test_regress/t/*.py \
|
||||
|
||||
# Python files, test_regress tests
|
||||
@@ -538,6 +534,7 @@ YAPF = yapf3
|
||||
YAPF_FLAGS = -i --parallel
|
||||
|
||||
format-py yapf:
|
||||
$(YAPF) --version
|
||||
$(YAPF) $(YAPF_FLAGS) $(PY_FILES)
|
||||
|
||||
GERSEMI = gersemi
|
||||
@@ -554,6 +551,9 @@ format-make:
|
||||
|
||||
format-yaml: yamlfix
|
||||
|
||||
MYPY = mypy
|
||||
MYPY_FLAGS = --strict --no-error-summary
|
||||
|
||||
PYLINT = pylint
|
||||
PYLINT_FLAGS = --recursive=n --score=n --disable=R0801
|
||||
PYLINT_TEST_FLAGS = $(PYLINT_FLAGS) --disable=C0103,C0114,C0116,C0209,C0411,C0413,C0301,R0801,R0912,R0915,R0916,R1702,W0511,W0621
|
||||
@@ -563,7 +563,16 @@ RUFF_FLAGS = check --ignore=E402,E501,E701
|
||||
|
||||
# "make -k" so can see all tool result errors
|
||||
lint-py:
|
||||
$(MAKE) -k lint-py-pylint lint-py-pylint-tests lint-py-ruff
|
||||
$(MAKE) -k lint-py-mypy lint-py-mypy-none lint-py-pylint lint-py-pylint-tests lint-py-ruff
|
||||
|
||||
lint-py-mypy:
|
||||
for filename in `fgrep -l '# mypy' $(PY_PROGRAMS)`; do \
|
||||
echo "$(MYPY) $(MYPY_FLAGS) $$filename" ; \
|
||||
$(MYPY) $(MYPY_FLAGS) $$filename ; \
|
||||
done
|
||||
|
||||
lint-py-mypy-none:
|
||||
@echo "mypy not checking: " `fgrep -L '# mypy' $(PY_PROGRAMS)`
|
||||
|
||||
lint-py-pylint:
|
||||
$(PYLINT) $(PYLINT_FLAGS) $(PY_PROGRAMS)
|
||||
@@ -599,6 +608,149 @@ else
|
||||
autoconf
|
||||
endif
|
||||
|
||||
######################################################################
|
||||
# Coverage collection and reporting
|
||||
|
||||
COVERAGE_DIR := obj_coverage
|
||||
|
||||
ifeq ($(CFG_WITH_DEV_GCOV),yes)
|
||||
|
||||
# Figure out base and head refs for coverage report
|
||||
COVERAGE_REF_BASE := $(if $(COVERAGE_BASE),$(shell git rev-parse --short $(COVERAGE_BASE)))
|
||||
COVERAGE_REF_HEAD := $(shell git rev-parse --short HEAD)
|
||||
override undefine COVERAGE_BASE # Use the above variabels instead
|
||||
|
||||
# 'fastcov' setup
|
||||
FASTCOV := nodist/fastcov.py
|
||||
FASTCOV_OPT := -j $(shell nproc)
|
||||
FASTCOV_OPT += --lcov
|
||||
FASTCOV_OPT += --process-gcno
|
||||
FASTCOV_OPT += --branch-coverage
|
||||
FASTCOV_OPT += --dump-statistic
|
||||
# Files matching the following glob patterns will be excluded from coverage
|
||||
FASTCOV_OPT += --exclude-glob
|
||||
FASTCOV_OPT += '/usr/*'
|
||||
FASTCOV_OPT += '*examples/*'
|
||||
FASTCOV_OPT += '*include/gtkwave/*'
|
||||
FASTCOV_OPT += '*src/obj_dbg/*'
|
||||
FASTCOV_OPT += '*src/obj_opt/*.yy.cpp'
|
||||
FASTCOV_OPT += '*src/obj_opt/V3Ast*'
|
||||
FASTCOV_OPT += '*src/obj_opt/V3Dfg*'
|
||||
FASTCOV_OPT += '*src/obj_opt/V3ParseBison.c'
|
||||
FASTCOV_OPT += '*test_regress/*'
|
||||
# Lines *containing* these substrings will be excluded from *all* coverage
|
||||
FASTCOV_OPT += --custom-exclusion-marker
|
||||
FASTCOV_OPT += ASTGEN_MEMBERS
|
||||
FASTCOV_OPT += ERROR_RSVD_WORD
|
||||
FASTCOV_OPT += LCOV_EXCL_LINE
|
||||
FASTCOV_OPT += V3ERROR_NA
|
||||
FASTCOV_OPT += VL_DEFINE_DEBUG_FUNCTIONS
|
||||
FASTCOV_OPT += VL_FATAL
|
||||
FASTCOV_OPT += VL_RTTI_IMPL
|
||||
FASTCOV_OPT += VL_UNREACHABLE
|
||||
FASTCOV_OPT += v3fatalSrc
|
||||
# Lines *starting* with these substrings will be ecluded from *branch* coverage
|
||||
FASTCOV_OPT += --exclude-br-lines-starting-with
|
||||
FASTCOV_OPT += BROKEN_BASE_RTN
|
||||
FASTCOV_OPT += BROKEN_RTN
|
||||
FASTCOV_OPT += NUM_ASSERT
|
||||
FASTCOV_OPT += SELF_CHECK
|
||||
FASTCOV_OPT += UASSERT
|
||||
FASTCOV_OPT += UINFO
|
||||
FASTCOV_OPT += assert
|
||||
FASTCOV_OPT += 'if (VL_UNCOVERABLE'
|
||||
FASTCOV_OPT += '} else if (VL_UNCOVERABLE'
|
||||
|
||||
# 'genhtml' setup
|
||||
GENHTML := genhtml
|
||||
GENHTML_OPT := -j $(shell nproc)
|
||||
GENHTML_OPT += --branch-coverage
|
||||
GENHTML_OPT += --demangle-cpp
|
||||
GENHTML_OPT += --missed
|
||||
GENHTML_OPT += --rc branch_coverage=1
|
||||
GENHTML_OPT += --rc genhtml_hi_limit=100
|
||||
GENHTML_OPT += --ignore-errors negative
|
||||
ifeq ($(COVERAGE_REF_BASE),)
|
||||
GENHTML_OPT += --header-title "Code coverage for Verilator $(shell git describe --dirty)"
|
||||
else
|
||||
GENHTML_OPT += --header-title "Patch coverage for Verilator $(COVERAGE_REF_BASE)..$(COVERAGE_REF_HEAD)$(if $(shell git status --porcelain),-dirty)"
|
||||
endif
|
||||
GENHTML_OPT += --flat
|
||||
GENHTML_OPT += --precision 2
|
||||
GENHTML_OPT += --legend
|
||||
GENHTML_OPT += --show-proportion
|
||||
GENHTML_OPT += --filter brace,blank,range
|
||||
|
||||
# There are loads (~20k combined), but using this seems fine on modern hardware
|
||||
GCNO_FILES = $(shell find . -name '*.gcno')
|
||||
GCDA_FILES = $(shell find . -name '*.gcda')
|
||||
|
||||
# Combine all .gcda coverage date files into lcov .info file
|
||||
$(COVERAGE_DIR)/verilator.info: $(GCNO_FILES) $(GCDA_FILES)
|
||||
@echo "####################################################################"
|
||||
@echo "# fastcov: combining all .gcda files into lcov .info"
|
||||
@echo "####################################################################"
|
||||
@mkdir -p $(COVERAGE_DIR)
|
||||
/usr/bin/time -f "That took %E" \
|
||||
$(FASTCOV) $(FASTCOV_OPT) --output $@
|
||||
|
||||
# Filter combined .info file for patch coverage
|
||||
$(COVERAGE_DIR)/verilator-patch.info: $(COVERAGE_DIR)/verilator.info
|
||||
@echo "####################################################################"
|
||||
@echo "# fastcov: Filtering for patch coverage"
|
||||
@echo "####################################################################"
|
||||
rm -f $(COVERAGE_DIR)/empty-patch
|
||||
git diff $(COVERAGE_REF_BASE) -- include src > $(COVERAGE_DIR)/filter.patch
|
||||
[ -s $(COVERAGE_DIR)/filter.patch ]] || touch $(COVERAGE_DIR)/empty-patch
|
||||
$(FASTCOV) -C $^ --lcov -o $@ --diff-filter $(COVERAGE_DIR)/filter.patch
|
||||
|
||||
# Build coverage report
|
||||
$(COVERAGE_DIR)/report/index.html: $(COVERAGE_DIR)/verilator$(if $(COVERAGE_REF_BASE),-patch).info
|
||||
@echo "####################################################################"
|
||||
@echo "# genhtml: Generating coverage report"
|
||||
@echo "####################################################################"
|
||||
@rm -rf $(COVERAGE_DIR)/report
|
||||
[ -f $(COVERAGE_DIR)/empty-patch ]] || /usr/bin/time -f "That took %E" \
|
||||
$(GENHTML) $(GENHTML_OPT) --output-directory $(COVERAGE_DIR)/report $^ || true
|
||||
@# Uncommitted changes not tracked, force rebuild on next run if patch coverage
|
||||
@$(if $(COVERAGE_REF_BASE),mv $(COVERAGE_DIR)/verilator-patch.info $(COVERAGE_DIR)/verilator-patch-last.info)
|
||||
|
||||
# Convenience targets
|
||||
.PHONY: coverage-combine
|
||||
coverage-combine: $(COVERAGE_DIR)/verilator.info
|
||||
|
||||
# Via recursive make, so the message is always printed
|
||||
.PHONY: coverage-report
|
||||
coverage-report:
|
||||
@$(MAKE) --no-print-directory $(COVERAGE_DIR)/report/index.html || true
|
||||
@if [ -f $(COVERAGE_DIR)/report/index.html ]; then \
|
||||
echo "####################################################################"; \
|
||||
echo "# Coverage report is at: $(COVERAGE_DIR)/report/index.html"; \
|
||||
echo "# Use 'make coverage-view' to open it in your default browser"; \
|
||||
echo "####################################################################"; \
|
||||
elif [ -f $(COVERAGE_DIR)/empty-patch ]; then \
|
||||
echo "####################################################################"; \
|
||||
echo "# Patch is empty"; \
|
||||
echo "####################################################################"; \
|
||||
else \
|
||||
echo "####################################################################"; \
|
||||
echo "# Failed to create coverage report. Maybe no data, or error?"; \
|
||||
echo "####################################################################"; \
|
||||
false; \
|
||||
fi
|
||||
|
||||
# Open covarage report in default web browser
|
||||
.PHONY: coverage-view
|
||||
coverage-view: coverage-report
|
||||
@test -f $(COVERAGE_DIR)/report/index.html && open $(COVERAGE_DIR)/report/index.html || true
|
||||
|
||||
# Deletes all coverage data files (.gcda)
|
||||
.PHONY: coverage-zero
|
||||
coverage-zero: # 'rm $(GCDA_FILES)' might fail with too many args
|
||||
$(FASTCOV) --zerocounters
|
||||
|
||||
endif
|
||||
|
||||
######################################################################
|
||||
# Clean
|
||||
|
||||
@@ -609,8 +761,8 @@ maintainer-clean::
|
||||
|
||||
clean mostlyclean distclean maintainer-clean maintainer-copy::
|
||||
for dir in $(SUBDIRS); do \
|
||||
echo making $@ in $$dir ; \
|
||||
$(MAKE) -C $$dir $@ ; \
|
||||
echo making $@ in $$dir ; \
|
||||
$(MAKE) -C $$dir $@ ; \
|
||||
done
|
||||
|
||||
clean mostlyclean distclean maintainer-clean::
|
||||
@@ -624,7 +776,7 @@ clean mostlyclean distclean maintainer-clean::
|
||||
rm -rf src/*.tidy include/*.tidy examples/*/*.tidy
|
||||
rm -rf .ruff_cache
|
||||
rm -rf nodist/fuzzer/dictionary
|
||||
rm -rf nodist/obj_dir
|
||||
rm -rf $(COVERAGE_DIR)
|
||||
rm -rf verilator.txt
|
||||
|
||||
distclean maintainer-clean::
|
||||
|
||||
@@ -37,6 +37,7 @@ Welcome to Verilator
|
||||
* - **Widely Used**
|
||||
* Wide industry and academic deployment
|
||||
* Out-of-the-box support from Arm and RISC-V vendor IP
|
||||
* Over 700 contributors
|
||||
- |verilator usage|
|
||||
* - |verilator community|
|
||||
- **Community Driven & Openly Licensed**
|
||||
@@ -137,6 +138,9 @@ Related Projects
|
||||
- `Icarus Verilog`_ - Icarus is a highly-featured interpreted Verilog
|
||||
simulator. If Verilator does not support your needs, perhaps Icarus may.
|
||||
|
||||
- `Surfer <https://surfer-project.org/>`_ - Web or offline waveform viewer
|
||||
for Verilator traces.
|
||||
|
||||
|
||||
Open License
|
||||
============
|
||||
|
||||
+51
-26
@@ -28,6 +28,7 @@ autoflush STDOUT 1;
|
||||
autoflush STDERR 1;
|
||||
|
||||
$Debug = 0;
|
||||
my $opt_aslr;
|
||||
my $opt_gdb;
|
||||
my $opt_rr;
|
||||
my $opt_gdbbt;
|
||||
@@ -56,6 +57,7 @@ if (! GetOptions(
|
||||
"debug" => \&debug,
|
||||
# "version!" => \&version, # Also passthru'ed
|
||||
# Switches
|
||||
"aslr!" => \$opt_aslr,
|
||||
"gdb!" => \$opt_gdb,
|
||||
"gdbbt!" => \$opt_gdbbt,
|
||||
"quiet!" => \$opt_quiet_exit, # As -quiet implies -quiet-exit
|
||||
@@ -97,7 +99,7 @@ my @quoted_sw = map { sh_escape($_) } @Opt_Verilator_Sw;
|
||||
if ($opt_gdb) {
|
||||
# Generic GDB interactive
|
||||
run (ulimit_stack_unlimited()
|
||||
. aslr_off()
|
||||
. aslr(0)
|
||||
. ($ENV{VERILATOR_GDB} || "gdb")
|
||||
. " " . verilator_bin()
|
||||
# Note, uncomment to set breakpoints before running:
|
||||
@@ -114,13 +116,13 @@ if ($opt_gdb) {
|
||||
} elsif ($opt_rr) {
|
||||
# Record with rr
|
||||
run (ulimit_stack_unlimited()
|
||||
. aslr_off()
|
||||
. aslr(0)
|
||||
. "rr record " . verilator_bin()
|
||||
. " " . join(' ', @quoted_sw));
|
||||
} elsif ($opt_gdbbt && $Debug) {
|
||||
# Run under GDB to get gdbbt
|
||||
run (ulimit_stack_unlimited()
|
||||
. aslr_off()
|
||||
. aslr(0)
|
||||
. "gdb"
|
||||
. " " . verilator_bin()
|
||||
. " --batch --quiet --return-child-result"
|
||||
@@ -135,19 +137,19 @@ if ($opt_gdb) {
|
||||
);
|
||||
|
||||
run (ulimit_stack_unlimited()
|
||||
. aslr_off()
|
||||
. aslr(0)
|
||||
. $valgrind_bin
|
||||
. " " . verilator_bin()
|
||||
. " " . join(' ', @quoted_sw));
|
||||
} elsif ($Debug) {
|
||||
# Debug
|
||||
run(ulimit_stack_unlimited()
|
||||
. aslr_off()
|
||||
. aslr(0)
|
||||
. verilator_bin()
|
||||
. " " . join(' ', @quoted_sw));
|
||||
} else {
|
||||
# Normal, non gdb
|
||||
run(ulimit_stack_unlimited() . verilator_bin() . " " . join(' ', @quoted_sw));
|
||||
run(ulimit_stack_unlimited() . aslr(1) . verilator_bin() . " " . join(' ', @quoted_sw));
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
@@ -192,21 +194,37 @@ sub gdb_works {
|
||||
return $status == 0;
|
||||
}
|
||||
|
||||
sub aslr_off {
|
||||
my $ok = `setarch --addr-no-randomize echo ok 2>/dev/null` || "";
|
||||
if ($ok =~ /ok/) {
|
||||
return "setarch --addr-no-randomize ";
|
||||
} else {
|
||||
return "";
|
||||
sub aslr {
|
||||
my $want_on = shift;
|
||||
$want_on = $opt_aslr if defined $opt_aslr;
|
||||
if (!$want_on) {
|
||||
my $ok = `setarch --addr-no-randomize echo ok 2>/dev/null` || "";
|
||||
if ($ok =~ /ok/) {
|
||||
return "setarch --addr-no-randomize ";
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
sub ulimit_stack_unlimited {
|
||||
return "" if !$opt_unlimited_stack;
|
||||
system("ulimit -s unlimited 2>/dev/null");
|
||||
my $limit = "unlimited";
|
||||
# AddressSanitizer doesn't work with 'ulimit -s unlimted'
|
||||
if (`${\(verilator_bin())} --get-supported DEV_ASAN` eq "1\n") {
|
||||
# Use host 'physical memory / #cores / 8' instead
|
||||
open(my $fh, "<", "/proc/meminfo") || die "Can't read host memory for asan";
|
||||
while (<$fh>) {
|
||||
if (m/MemTotal:\s+(\d+)\s+kB/) {
|
||||
$limit = int(int($1)/`nproc`/8);
|
||||
last;
|
||||
}
|
||||
}
|
||||
close($fh);
|
||||
}
|
||||
system("ulimit -s $limit 2>/dev/null");
|
||||
my $status = $?;
|
||||
if ($status == 0) {
|
||||
return "ulimit -s unlimited 2>/dev/null; exec ";
|
||||
return "ulimit -s $limit 2>/dev/null; exec ";
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
@@ -227,17 +245,18 @@ sub run {
|
||||
warn "%Error: export VERILATOR_ROOT=" . ($ENV{VERILATOR_ROOT} || "") . "\n";
|
||||
warn "%Error: $command\n";
|
||||
}
|
||||
if ($status & 127) {
|
||||
if (($status & 127) == 4 # SIGILL
|
||||
|| ($status & 127) == 8 # SIGFPA
|
||||
|| ($status & 127) == 11) { # SIGSEGV
|
||||
my $signal = ($status & 127);
|
||||
if ($signal) {
|
||||
if ($signal == 4 # SIGILL
|
||||
|| $signal == 8 # SIGFPA
|
||||
|| $signal == 11) { # SIGSEGV
|
||||
warn "%Error: Verilator internal fault, sorry. "
|
||||
. "Suggest trying --debug --gdbbt\n" if !$Debug;
|
||||
} elsif (($status & 127) == 6) { # SIGABRT
|
||||
} elsif ($signal == 6) { # SIGABRT
|
||||
warn "%Error: Verilator aborted. "
|
||||
. "Suggest trying --debug --gdbbt\n" if !$Debug;
|
||||
} else {
|
||||
warn "%Error: Verilator threw signal $status. "
|
||||
warn "%Error: Verilator threw signal $signal. "
|
||||
. "Suggest trying --debug --gdbbt\n" if !$Debug;
|
||||
}
|
||||
}
|
||||
@@ -245,8 +264,8 @@ sub run {
|
||||
warn "%Error: Command Failed $command\n";
|
||||
}
|
||||
exit $! if $!; # errno
|
||||
exit $? >> 8 if $? >> 8; # child exit status
|
||||
exit 255; # last resort
|
||||
exit $? >> 8 if $? >> 8; # pass along child exit code
|
||||
exit 128 + $signal; # last resort
|
||||
}
|
||||
}
|
||||
|
||||
@@ -311,6 +330,7 @@ detailed descriptions of these arguments.
|
||||
+1800-2012ext+<ext> Use SystemVerilog 2012 with file extension <ext>
|
||||
+1800-2017ext+<ext> Use SystemVerilog 2017 with file extension <ext>
|
||||
+1800-2023ext+<ext> Use SystemVerilog 2023 with file extension <ext>
|
||||
--no-aslr Disable address space layout randomization
|
||||
--no-assert Disable all assertions
|
||||
--no-assert-case Disable unique/unique0/priority-case assertions
|
||||
--autoflush Flush streams after all $displays
|
||||
@@ -322,8 +342,6 @@ detailed descriptions of these arguments.
|
||||
--build-jobs <jobs> Parallelism for --build
|
||||
--cc Create C++ output
|
||||
-CFLAGS <flags> C++ compiler arguments for makefile
|
||||
--clk <signal-name> Mark specified signal as clock
|
||||
--no-clk <signal-name> Prevent marking specified signal as clock
|
||||
--compiler <compiler-name> Tune for specified C++ compiler
|
||||
--compiler-include Include additional header in the precompiled one
|
||||
--converge-limit <loops> Tune convergence settle time
|
||||
@@ -352,6 +370,7 @@ detailed descriptions of these arguments.
|
||||
--dump-defines Show preprocessor defines with -E
|
||||
--dump-dfg Enable dumping DfgGraphs to .dot files
|
||||
--dump-graph Enable dumping V3Graphs to .dot files
|
||||
--dump-inputs Enable dumping preprocessed input files
|
||||
--dump-tree Enable dumping Ast .tree files
|
||||
--dump-tree-addrids Use short identifiers instead of addresses
|
||||
--dump-tree-dot Enable dumping Ast .tree.dot debug files
|
||||
@@ -382,7 +401,9 @@ detailed descriptions of these arguments.
|
||||
--getenv <var> Get environment variable with defaults
|
||||
--help Show this help
|
||||
--hierarchical Enable hierarchical Verilation
|
||||
--hierarchical-params-file <name> Internal option that specifies parameters file for hier blocks
|
||||
--hierarchical-block <block> Internal use only for --hierarchical
|
||||
--hierarchical-child <block> Internal use only for --hierarchical
|
||||
--hierarchical-params-file <name> Internal option that specifies parameters file for hier blocks
|
||||
--hierarchical-threads <threads> Number of threads for hierarchical scheduling
|
||||
-I<dir> Directory to search for includes
|
||||
--if-depth <value> Tune IFDEPTH warning
|
||||
@@ -400,6 +421,7 @@ detailed descriptions of these arguments.
|
||||
-LDFLAGS <flags> Linker pre-object arguments for makefile
|
||||
--lib-create <name> Create a DPI library
|
||||
+libext+<ext>+[ext]... Extensions for finding modules
|
||||
+librescan Ignored for compatibility
|
||||
--lint-only Lint, but do not make output
|
||||
--localize-max-size <value> Tune localize optimization variable size
|
||||
--main Generate C++ main() file
|
||||
@@ -414,6 +436,8 @@ detailed descriptions of these arguments.
|
||||
+notimingchecks Ignored
|
||||
-o <executable> Name of final executable
|
||||
-O0 Disable optimizations
|
||||
-O1 Default optimizations
|
||||
-O2 Stronger optimizations
|
||||
-O3 High-performance optimizations
|
||||
-O<optimization-letter> Selectable optimizations
|
||||
--output-groups <numfiles> Group .cpp files into larger ones
|
||||
@@ -429,8 +453,9 @@ detailed descriptions of these arguments.
|
||||
--pins-uint8 Specify types for top-level ports
|
||||
--no-pins64 Don't use uint64_t's for 33-64 bit sigs
|
||||
--pipe-filter <command> Filter all input through a script
|
||||
--pp-comments Show preprocessor comments with -E
|
||||
--prefix <topname> Name of top-level class
|
||||
--preproc-comments Include preprocessor comments in the output with -E
|
||||
--preproc-defines Include preprocessor defines in the output with -E
|
||||
--preproc-resolve Include all found modules in the output with -E
|
||||
--preproc-token-limit Maximum tokens on a line allowed by preprocessor
|
||||
--private Debugging; see docs
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# mypy: disallow-untyped-defs
|
||||
# pylint: disable=C0103,C0114,C0115,C0116,C0123,C0209,C0301,R0902,R0913,R0914,R0912,R0915,W0621
|
||||
######################################################################
|
||||
|
||||
@@ -36,7 +37,7 @@ results = {}
|
||||
elapsed = {}
|
||||
|
||||
|
||||
def toDateTime(s):
|
||||
def toDateTime(s: str) -> datetime:
|
||||
return datetime.strptime(s, "%Y-%m-%dT%H:%M:%S.%f")
|
||||
|
||||
|
||||
@@ -53,6 +54,7 @@ for logfile in args.logdir.iterdir():
|
||||
match = re.match(r'\[(\S+)\s.*Result: (.*)$', line)
|
||||
if match:
|
||||
assert obj is not None
|
||||
assert start is not None
|
||||
elapsed[obj] = toDateTime(match.group(1)) - start
|
||||
results[obj] = match.group(2)
|
||||
|
||||
|
||||
@@ -118,21 +118,24 @@ sub run {
|
||||
warn "%Error: export VERILATOR_ROOT=" . ($ENV{VERILATOR_ROOT} || "") . "\n";
|
||||
warn "%Error: $command\n";
|
||||
}
|
||||
if ($status & 127) {
|
||||
if (($status & 127) == 8 || ($status & 127) == 11) { # SIGFPA or SIGSEGV
|
||||
my $signal = ($status & 127);
|
||||
if ($signal) {
|
||||
if ($signal == 4 # SIGILL
|
||||
|| $signal == 8 # SIGFPA
|
||||
|| $signal == 11) { # SIGSEGV
|
||||
warn "%Error: Verilator_coverage internal fault, sorry.\n" if !$Debug;
|
||||
} elsif (($status & 127) == 6) { # SIGABRT
|
||||
} elsif ($signal == 6) { # SIGABRT
|
||||
warn "%Error: Verilator_coverage aborted.\n" if !$Debug;
|
||||
} else {
|
||||
warn "%Error: Verilator_coverage threw signal $status.\n" if !$Debug;
|
||||
warn "%Error: Verilator_coverage threw signal $signal.\n" if !$Debug;
|
||||
}
|
||||
}
|
||||
if ($status != 256 || $Debug) { # i.e. not normal exit(1)
|
||||
warn "%Error: Command Failed $command\n";
|
||||
}
|
||||
exit $! if $!; # errno
|
||||
exit $? >> 8 if $? >> 8; # child exit status
|
||||
exit 255; # last resort
|
||||
exit $? >> 8 if $? >> 8; # pass along child exit code
|
||||
exit 128 + $signal; # last resort
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+26
-23
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
# pylint: disable=C0103,C0114,C0116,C0209
|
||||
# mypy: disallow-untyped-defs
|
||||
# pylint: disable=C0103,C0114,C0116,C0209,W0603
|
||||
######################################################################
|
||||
|
||||
import argparse
|
||||
@@ -9,25 +10,29 @@ import os.path
|
||||
import re
|
||||
import sys
|
||||
|
||||
exit_code = 0
|
||||
|
||||
def diff(a, b):
|
||||
|
||||
def diff(a: str, b: str) -> None:
|
||||
if not os.path.exists(a):
|
||||
sys.exit("%Error: No old diff filename found: " + a)
|
||||
sys.stderr.write("%Error: No old diff filename found: " + a + "\n")
|
||||
sys.exit(2)
|
||||
if not os.path.exists(b):
|
||||
sys.exit("%Error: No new diff filename found: " + b)
|
||||
sys.stderr.write("%Error: No new diff filename found: " + b + "\n")
|
||||
sys.exit(2)
|
||||
|
||||
if os.path.isdir(a) and os.path.isdir(b):
|
||||
diff_dir(a, b)
|
||||
elif os.path.isfile(a) and os.path.isfile(b):
|
||||
diff_file(a, b)
|
||||
else:
|
||||
sys.exit("%Error: Mix of files and dirs")
|
||||
sys.stderr.write("%Error: Mix of files and dirs")
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
def diff_dir(a, b):
|
||||
def diff_dir(a: str, b: str) -> None:
|
||||
# Diff all files under two directories
|
||||
files = collections.defaultdict(lambda: {})
|
||||
files: dict[str, dict[str, str]] = collections.defaultdict(lambda: {})
|
||||
|
||||
for fn in glob.glob(a + "/*.tree"):
|
||||
base = re.sub(r'.*/', '', fn)
|
||||
@@ -50,7 +55,9 @@ def diff_dir(a, b):
|
||||
sys.stderr.write("%Warning: No .tree files found that have similar base names\n")
|
||||
|
||||
|
||||
def diff_file(a, b):
|
||||
def diff_file(a: str, b: str) -> None:
|
||||
global exit_code
|
||||
|
||||
# Compare the two tree files
|
||||
short_a = re.sub(r'[^a-zA-Z0-9.]+', '_', a)
|
||||
short_b = re.sub(r'[^a-zA-Z0-9.]+', '_', b)
|
||||
@@ -65,25 +72,18 @@ def diff_file(a, b):
|
||||
|
||||
filterf(a, tmp_a)
|
||||
filterf(b, tmp_b)
|
||||
os.system("diff -u " + tmp_a + " " + tmp_b)
|
||||
status = os.system("diff -u " + tmp_a + " " + tmp_b)
|
||||
os.unlink(tmp_a)
|
||||
os.unlink(tmp_b)
|
||||
|
||||
|
||||
def version_from(filename):
|
||||
# Return dump format
|
||||
with open(filename, "r", encoding="utf8") as fh:
|
||||
lineno = 0
|
||||
for line in fh:
|
||||
if lineno > 10:
|
||||
break
|
||||
match = re.search(r'format (0x[0-9.]+)', line)
|
||||
if match:
|
||||
return hex(match.group(1))
|
||||
return 1.0
|
||||
status_exit_code = status >> 8
|
||||
if status_exit_code == 1:
|
||||
exit_code = 1
|
||||
elif status_exit_code:
|
||||
exit_code = 2
|
||||
|
||||
|
||||
def filterf(fn1, fn2):
|
||||
def filterf(fn1: str, fn2: str) -> None:
|
||||
# Remove hex numbers before diffing
|
||||
with open(fn1, "r", encoding="utf8") as fh1:
|
||||
with open(fn2, "w", encoding="utf8") as fh2:
|
||||
@@ -107,7 +107,9 @@ parser = argparse.ArgumentParser(
|
||||
|
||||
Verilator_difftree is used for debugging Verilator tree output files.
|
||||
It performs a diff between two files, or all files common between two
|
||||
directories, ignoring irrelevant pointer differences.""",
|
||||
directories, ignoring irrelevant pointer differences.
|
||||
|
||||
Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.""",
|
||||
epilog="""Copyright 2005-2025 by Wilson Snyder. This program is free software; you
|
||||
can redistribute it and/or modify it under the terms of either the GNU
|
||||
Lesser General Public License Version 3 or the Perl Artistic License
|
||||
@@ -124,6 +126,7 @@ parser.add_argument('fileb', help='input file b to diff')
|
||||
|
||||
Args = parser.parse_args()
|
||||
diff(Args.filea, Args.fileb)
|
||||
sys.exit(exit_code)
|
||||
|
||||
######################################################################
|
||||
# Local Variables:
|
||||
|
||||
+18
-9
@@ -33,7 +33,7 @@ ThreadScheduleWaitIntervals = [] # list of (start, tick, ecpu) pairs
|
||||
######################################################################
|
||||
|
||||
|
||||
def read_data(filename):
|
||||
def read_data(filename: str) -> None:
|
||||
with open(filename, "r", encoding="utf8") as fh:
|
||||
re_thread = re.compile(r'^VLPROFTHREAD (\d+)$')
|
||||
re_record = re.compile(r'^VLPROFEXEC (\S+) (\d+)(.*)$')
|
||||
@@ -51,6 +51,7 @@ def read_data(filename):
|
||||
re_proc_dat = re.compile(r'VLPROFPROC ([a-z_ ]+)\s*:\s*(.*)$')
|
||||
cpu = None
|
||||
thread = 0
|
||||
thread_last_ecpu = None
|
||||
|
||||
global LongestVcdStrValueLength
|
||||
global ExecGraphTime
|
||||
@@ -109,9 +110,13 @@ def read_data(filename):
|
||||
tick)
|
||||
elif kind == "THREAD_SCHEDULE_WAIT_BEGIN":
|
||||
ecpu = int(re_payload_wait.match(payload).groups()[0])
|
||||
thread_last_ecpu = ecpu
|
||||
ThreadScheduleWait[ecpu].append(tick)
|
||||
elif kind == "THREAD_SCHEDULE_WAIT_END":
|
||||
ecpu = int(re_payload_wait.match(payload).groups()[0])
|
||||
# Might have ended on different CPU then we got THREAD_SCHEDULE_WAIT_BEGIN
|
||||
assert thread_last_ecpu is not None, "THREAD_SCHEDULE_WAIT_END without BEGIN"
|
||||
ecpu = thread_last_ecpu
|
||||
thread_last_ecpu = None
|
||||
start = ThreadScheduleWait[ecpu].pop()
|
||||
WaitingTime += tick - start
|
||||
ThreadScheduleWaitIntervals.append((start, tick, ecpu))
|
||||
@@ -166,7 +171,7 @@ def re_match_result(regexp, line, result_to):
|
||||
######################################################################
|
||||
|
||||
|
||||
def report():
|
||||
def report() -> None:
|
||||
print("Verilator Gantt report")
|
||||
|
||||
print("\nArgument settings:")
|
||||
@@ -215,12 +220,12 @@ def report():
|
||||
print()
|
||||
|
||||
|
||||
def report_numa():
|
||||
def report_numa() -> None:
|
||||
print("\nNUMA assignment:")
|
||||
print(" NUMA status = %s" % Global['info']['numa'])
|
||||
|
||||
|
||||
def report_mtasks():
|
||||
def report_mtasks() -> None:
|
||||
if not Mtasks:
|
||||
return
|
||||
|
||||
@@ -238,6 +243,7 @@ def report_mtasks():
|
||||
thread_mtask_time = collections.defaultdict(lambda: 0)
|
||||
long_mtask_time = 0
|
||||
long_mtask = None
|
||||
long_mtask_hier_block = None
|
||||
predict_mtask_time = 0
|
||||
predict_elapsed = 0
|
||||
for (hier_block, mtask_id) in Mtasks:
|
||||
@@ -279,6 +285,9 @@ def report_mtasks():
|
||||
max_p2e = -1000000
|
||||
max_mtask = None
|
||||
|
||||
min_hier_block = None
|
||||
max_hier_block = None
|
||||
|
||||
for (hier_block, mtask_id) in sorted(Mtasks.keys()):
|
||||
mtask = Mtasks[(hier_block, mtask_id)]
|
||||
if mtask['elapsed'] > 0:
|
||||
@@ -333,7 +342,7 @@ def report_mtasks():
|
||||
print(" e ^ stddev = %0.3f" % math.exp(stddev))
|
||||
|
||||
|
||||
def report_cpus():
|
||||
def report_cpus() -> None:
|
||||
print("\nCPU info:")
|
||||
|
||||
Global['cpu_sockets'] = collections.defaultdict(lambda: 0)
|
||||
@@ -368,14 +377,14 @@ def report_cpus():
|
||||
Global['cpu_socket_cores_warning'] = True
|
||||
|
||||
|
||||
def report_sections():
|
||||
def report_sections() -> None:
|
||||
for thread, section in Sections.items():
|
||||
if section:
|
||||
print(f"\nSection profile for thread {thread}:")
|
||||
report_section(section)
|
||||
|
||||
|
||||
def report_section(section):
|
||||
def report_section(section) -> None:
|
||||
totalTime = collections.defaultdict(lambda: 0)
|
||||
selfTime = collections.defaultdict(lambda: 0)
|
||||
|
||||
@@ -427,7 +436,7 @@ def report_section(section):
|
||||
######################################################################
|
||||
|
||||
|
||||
def write_vcd(filename):
|
||||
def write_vcd(filename: str) -> None:
|
||||
print("Writing %s" % filename)
|
||||
with open(filename, "w", encoding="utf8") as fh:
|
||||
# dict of dicts of hierarchy elements/signal name -> (code, width)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# mypy: disallow-untyped-defs
|
||||
# pylint: disable=C0114,C0209
|
||||
#
|
||||
# Copyright 2003-2025 by Wilson Snyder. This program is free software; you
|
||||
|
||||
@@ -10,7 +10,7 @@ import re
|
||||
######################################################################
|
||||
|
||||
|
||||
def profcfunc(filename):
|
||||
def profcfunc(filename: str) -> None:
|
||||
funcs = {}
|
||||
|
||||
with open(filename, "r", encoding="utf8") as fh:
|
||||
@@ -26,7 +26,7 @@ def profcfunc(filename):
|
||||
calls = float(match.group(3))
|
||||
func = match.group(4)
|
||||
if func not in funcs:
|
||||
funcs[func] = {'pct': 0, 'sec': 0, 'calls': 0}
|
||||
funcs[func] = {'pct': 0.0, 'sec': 0.0, 'calls': 0}
|
||||
funcs[func]['pct'] += pct
|
||||
funcs[func]['sec'] += sec
|
||||
funcs[func]['calls'] += calls
|
||||
@@ -150,7 +150,7 @@ def profcfunc(filename):
|
||||
print((" time seconds seconds calls %-" + str(design_width) +
|
||||
"s type filename and line number") % "design")
|
||||
|
||||
cume = 0
|
||||
cume = 0.0
|
||||
for func in sorted(vfuncs.keys(), key=lambda f: vfuncs[f]['sec'], reverse=True):
|
||||
cume += vfuncs[func]['sec']
|
||||
print(("%6.2f %9.2f %8.2f %10d %-" + str(design_width) + "s %s") %
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# DESCRIPTION: Verilator: CI ccache maintenance
|
||||
#
|
||||
# Copyright 2020 by Geza Lore. This program is free software; you
|
||||
# can redistribute it and/or modify it under the terms of either the GNU
|
||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||
# Version 2.0.
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
################################################################################
|
||||
# This script is run in 'before_script', once ccache has been set up.
|
||||
################################################################################
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
# Show version
|
||||
ccache --version
|
||||
|
||||
# Flush ccache if requested in commit message
|
||||
COMMIT="${CI_PULL_REQUEST_SHA:-$CI_COMMIT}"
|
||||
if git log --format=%B -n 1 "$COMMIT" | grep -q -i '\[CI\s\+ccache\s\+clear\]'; then
|
||||
echo "Flushing ccache due to commit message"
|
||||
ccache -C
|
||||
fi
|
||||
|
||||
# Dump stats, then zero stats
|
||||
# 22.04: ccache -s -v -z
|
||||
ccache -s -z
|
||||
+9
-2
@@ -37,6 +37,13 @@ else
|
||||
fatal "Unknown os: '$CI_OS_NAME'"
|
||||
fi
|
||||
|
||||
if [ "$CI_OS_NAME" = "linux" ]; then
|
||||
# Avoid slow "processing triggers for man db"
|
||||
echo "path-exclude /usr/share/doc/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
echo "path-exclude /usr/share/man/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
echo "path-exclude /usr/share/info/*" | sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nodoc
|
||||
fi
|
||||
|
||||
install-vcddiff() {
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
git clone https://github.com/veripool/vcddiff "$TMP_DIR"
|
||||
@@ -70,7 +77,7 @@ if [ "$CI_BUILD_STAGE_NAME" = "build" ]; then
|
||||
fi
|
||||
elif [ "$CI_OS_NAME" = "osx" ]; then
|
||||
brew update
|
||||
brew install ccache perl gperftools
|
||||
brew install ccache perl gperftools autoconf bison flex help2man
|
||||
elif [ "$CI_OS_NAME" = "freebsd" ]; then
|
||||
sudo pkg install -y autoconf bison ccache gmake perl5
|
||||
else
|
||||
@@ -78,7 +85,7 @@ if [ "$CI_BUILD_STAGE_NAME" = "build" ]; then
|
||||
fi
|
||||
|
||||
if [ -n "$CCACHE_DIR" ]; then
|
||||
mkdir -p "$CCACHE_DIR" && ./ci/ci-ccache-maint.bash
|
||||
mkdir -p "$CCACHE_DIR"
|
||||
fi
|
||||
elif [ "$CI_BUILD_STAGE_NAME" = "test" ]; then
|
||||
##############################################################################
|
||||
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
# DESCRIPTION: Verilator: CI script for 'pages.yml', notifies PRs
|
||||
#
|
||||
# Copyright 2025 by Geza Lore. This program is free software; you
|
||||
# can redistribute it and/or modify it under the terms of either the GNU
|
||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||
# Version 2.0.
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
# Notify PRs via comment that their coverage reports are available
|
||||
|
||||
# Get the current repo URL - might differ on a fork
|
||||
readonly REPO_URL=$(gh repo view --json url --jq .url)
|
||||
|
||||
# Create artifacts root directory
|
||||
ARTIFACTS_ROOT=artifacts
|
||||
mkdir -p ${ARTIFACTS_ROOT}
|
||||
|
||||
for RUN_ID in ${COVERAGE_PR_RUN_IDS//,/ }; do
|
||||
echo "@@@ Processing run ${RUN_ID}"
|
||||
|
||||
# Create workflow artifacts directory
|
||||
ARTIFACTS_DIR=${ARTIFACTS_ROOT}/${RUN_ID}
|
||||
mkdir -p ${ARTIFACTS_DIR}
|
||||
|
||||
# Download artifact of this run, if exists
|
||||
gh run download ${RUN_ID} --name coverage-pr-notification --dir ${ARTIFACTS_DIR} || true
|
||||
ls -lsha ${ARTIFACTS_DIR}
|
||||
|
||||
# Move on if no notification is required
|
||||
if [ ! -f ${ARTIFACTS_DIR}/pr-number.txt ]; then
|
||||
echo "No notification found"
|
||||
continue
|
||||
fi
|
||||
echo "Posting notification found"
|
||||
|
||||
cat ${ARTIFACTS_DIR}/body.txt
|
||||
gh pr comment $(cat ${ARTIFACTS_DIR}/pr-number.txt) --body-file ${ARTIFACTS_DIR}/body.txt
|
||||
|
||||
# Get the artifact ID
|
||||
ARTIFACT_ID=$(gh api "repos/{owner}/{repo}/actions/runs/${RUN_ID}/artifacts" --jq '.artifacts[] | select(.name == "coverage-pr-notification") | .id')
|
||||
|
||||
# Delete it, so we only notify once
|
||||
gh api --method DELETE "repos/{owner}/{repo}/actions/artifacts/${ARTIFACT_ID}"
|
||||
done
|
||||
Executable
+171
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env bash
|
||||
# DESCRIPTION: Verilator: CI script for 'pages.yml', builds the GitHub Pages
|
||||
#
|
||||
# Copyright 2025 by Geza Lore. This program is free software; you
|
||||
# can redistribute it and/or modify it under the terms of either the GNU
|
||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||
# Version 2.0.
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
|
||||
# This scipt build the content of the GitHub Pages for the repository.
|
||||
# Currently this only hosts code coverage reports, but it would be possible to
|
||||
# add any other contents to the page in parallel here.
|
||||
|
||||
# Developer note: You should be able to run this script in your local checkout
|
||||
# if you have GitHub CLI (command 'gh') setup, authenticated ('gh auth login'),
|
||||
# and have set a default repository ('gh repo set-default').
|
||||
|
||||
# Create pages root directory. The contents of this directory will be deployed
|
||||
# and served via GitHubPages
|
||||
readonly PAGES_ROOT=pages
|
||||
mkdir -p ${PAGES_ROOT}
|
||||
|
||||
# Get the current repo URL - might differ on a fork
|
||||
readonly REPO_URL=$(gh repo view --json url --jq .url)
|
||||
|
||||
# Set GITHUB_OUTPUT when run locally for testing
|
||||
if [[ -z "$GITHUB_OUTPUT" ]]; then
|
||||
GITHUB_OUTPUT=github-output.txt
|
||||
fi
|
||||
|
||||
# Populates ${PAGES_ROOT}/coverage-reports
|
||||
compile_coverage_reports() {
|
||||
# We will process all runs up to and including this date. This is chosen to be
|
||||
# slightly less than the artifact retention period for simplicity.
|
||||
local OLDEST=$(date --date="28 days ago" --iso-8601=date)
|
||||
|
||||
# Gather all coverage workflow runs within the time window
|
||||
gh run list -w coverage.yml --limit 1000 --created ">=${OLDEST}" --json "databaseId,event,status,conclusion,createdAt,number" > recentRuns.json
|
||||
echo @@@ Recent runs:
|
||||
jq "." recentRuns.json
|
||||
|
||||
# Select completd runs that were not cancelled or skipped, sort by descending run number
|
||||
jq 'sort_by(-.number) | map(select(.status == "completed" and (.conclusion == "success" or .conclusion == "failure")))' recentRuns.json > completedRuns.json
|
||||
echo @@@ Completed with success or failure:
|
||||
jq "." completedRuns.json
|
||||
|
||||
# Create artifacts root directory
|
||||
local ARTIFACTS_ROOT=artifacts
|
||||
mkdir -p ${ARTIFACTS_ROOT}
|
||||
|
||||
# Create coverage reports root directory
|
||||
local COVERAGE_ROOT=${PAGES_ROOT}/coverage-reports
|
||||
mkdir -p ${COVERAGE_ROOT}
|
||||
|
||||
# Create index page contents fragment
|
||||
local CONTENTS=contents.tmp
|
||||
echo > ${CONTENTS}
|
||||
|
||||
# Run IDs of PR jobs processed
|
||||
local PR_RUN_IDS=""
|
||||
|
||||
# Iterate over all unique event types that triggered the workflows
|
||||
for EVENT in $(jq -r 'map(.event) | sort | unique | .[]' completedRuns.json); do
|
||||
echo "@@@ Processing '${EVENT}' runs"
|
||||
|
||||
# Emit section header if a report exists with this event type
|
||||
EMIT_SECTION_HEADER=1
|
||||
|
||||
# For each worfklow run that was triggered by this event type
|
||||
for RUN_ID in $(jq ".[] | select(.event == \"${EVENT}\") |.databaseId" completedRuns.json); do
|
||||
echo "@@@ Processing run ${RUN_ID}"
|
||||
|
||||
# Extract the info of this run
|
||||
jq ".[] | select(.databaseId == $RUN_ID)" completedRuns.json > workflow.json
|
||||
jq "." workflow.json
|
||||
|
||||
# Record run ID of PR job
|
||||
if [[ $EVENT == "pull_request" ]]; then
|
||||
if [[ -z "$PR_RUN_IDS" ]]; then
|
||||
PR_RUN_IDS="$RUN_ID"
|
||||
else
|
||||
PR_RUN_IDS="$PR_RUN_IDS,$RUN_ID"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Create workflow artifacts directory
|
||||
local ARTIFACTS_DIR=${ARTIFACTS_ROOT}/${RUN_ID}
|
||||
mkdir -p ${ARTIFACTS_DIR}
|
||||
|
||||
# Download artifacts of this run, if exists
|
||||
gh run download ${RUN_ID} --name coverage-report --dir ${ARTIFACTS_DIR} || true
|
||||
ls -lsha ${ARTIFACTS_DIR}
|
||||
|
||||
# Move on if no coverage report is available
|
||||
if [ ! -d ${ARTIFACTS_DIR}/report ]; then
|
||||
echo "No coverage report found"
|
||||
continue
|
||||
fi
|
||||
echo "Coverage report found"
|
||||
|
||||
# Emit section header
|
||||
if [[ -n $EMIT_SECTION_HEADER ]]; then
|
||||
unset EMIT_SECTION_HEADER
|
||||
if [[ $EVENT == "pull_request" ]]; then
|
||||
echo "<h4>Patch coverage reports for '${EVENT}' runs:</h4>" >> ${CONTENTS}
|
||||
else
|
||||
echo "<h4>Code coverage reports for '${EVENT}' runs:</h4>" >> ${CONTENTS}
|
||||
fi
|
||||
fi
|
||||
|
||||
# Create pages subdirectory
|
||||
mv ${ARTIFACTS_DIR}/report ${COVERAGE_ROOT}/${RUN_ID}
|
||||
|
||||
# Add index page content
|
||||
local WORKFLOW_CREATED=$(jq -r '.createdAt' workflow.json)
|
||||
local WOFKRLOW_NUMBER=$(jq -r '.number' workflow.json)
|
||||
cat >> ${CONTENTS} <<CONTENTS_TEMPLATE
|
||||
Run <a href="${RUN_ID}/index.html">#${WOFKRLOW_NUMBER}</a>
|
||||
| GitHub: <a href="${REPO_URL}/actions/runs/${RUN_ID}">${RUN_ID}</a>
|
||||
| started at: ${WORKFLOW_CREATED}
|
||||
CONTENTS_TEMPLATE
|
||||
if [ -e ${ARTIFACTS_DIR}/pr-number.txt ]; then
|
||||
local PRNUMBER=$(cat ${ARTIFACTS_DIR}/pr-number.txt)
|
||||
echo " | Pull request: <a href=\"${REPO_URL}/pull/${PRNUMBER}\">#${PRNUMBER}</a>" >> ${CONTENTS}
|
||||
fi
|
||||
echo "<br>" >> ${CONTENTS}
|
||||
done
|
||||
|
||||
# Section break
|
||||
if [[ -z "$EMIT_SECTION_HEADER" ]]; then
|
||||
echo "<hr>" >> ${CONTENTS}
|
||||
fi
|
||||
done
|
||||
|
||||
# Write coverage report index.html
|
||||
cat > ${COVERAGE_ROOT}/index.html <<INDEX_TEMPLATE
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Verilator CI coverage reports</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: courier, serif;
|
||||
background-color: #f3f3f3;
|
||||
a {
|
||||
color: #008fd7;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
$(cat ${CONTENTS})
|
||||
<h4>Assembled $(date --iso-8601=minutes --utc)</h1>
|
||||
<body>
|
||||
|
||||
</html>
|
||||
INDEX_TEMPLATE
|
||||
|
||||
# Report size
|
||||
du -shc ${COVERAGE_ROOT}/*
|
||||
|
||||
# Set output
|
||||
echo "coverage-pr-run-ids=${PR_RUN_IDS}" >> $GITHUB_OUTPUT
|
||||
}
|
||||
|
||||
# Compilie coverage reports
|
||||
compile_coverage_reports;
|
||||
|
||||
# You can build any other content here to be put under ${PAGES_ROOT}
|
||||
+48
-48
@@ -27,6 +27,8 @@ if [ "$CI_OS_NAME" = "linux" ]; then
|
||||
elif [ "$CI_OS_NAME" = "osx" ]; then
|
||||
export MAKE=make
|
||||
NPROC=$(sysctl -n hw.logicalcpu)
|
||||
# Disable ccache, doesn't always work in GitHub Actions
|
||||
export OBJCACHE=
|
||||
elif [ "$CI_OS_NAME" = "freebsd" ]; then
|
||||
export MAKE=gmake
|
||||
NPROC=$(sysctl -n hw.ncpu)
|
||||
@@ -39,23 +41,27 @@ if [ "$CI_BUILD_STAGE_NAME" = "build" ]; then
|
||||
##############################################################################
|
||||
# Build verilator
|
||||
|
||||
if [ "$COVERAGE" != 1 ]; then
|
||||
autoconf
|
||||
./configure --enable-longtests --enable-ccwarn --prefix="$INSTALL_DIR"
|
||||
ccache -z
|
||||
"$MAKE" -j "$NPROC" -k
|
||||
# 22.04: ccache -s -v
|
||||
ccache -s
|
||||
if [ "$CI_OS_NAME" = "osx" ]; then
|
||||
file bin/verilator_bin
|
||||
file bin/verilator_bin_dbg
|
||||
md5 bin/verilator_bin
|
||||
md5 bin/verilator_bin_dbg
|
||||
stat bin/verilator_bin
|
||||
stat bin/verilator_bin_dbg
|
||||
fi
|
||||
else
|
||||
nodist/code_coverage --stages 0-2
|
||||
autoconf
|
||||
CONFIGURE_ARGS="--enable-longtests --enable-ccwarn"
|
||||
if [ "$CI_DEV_ASAN" = 1 ]; then
|
||||
CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-dev-asan"
|
||||
CXX="$CXX -DVL_LEAK_CHECKS"
|
||||
fi
|
||||
if [ "$CI_DEV_GCOV" = 1 ]; then
|
||||
CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-dev-gcov"
|
||||
fi
|
||||
./configure $CONFIGURE_ARGS --prefix="$INSTALL_DIR"
|
||||
ccache -z
|
||||
"$MAKE" -j "$NPROC" -k
|
||||
# 22.04: ccache -s -v
|
||||
ccache -s
|
||||
if [ "$CI_OS_NAME" = "osx" ]; then
|
||||
file bin/verilator_bin
|
||||
file bin/verilator_bin_dbg
|
||||
md5 bin/verilator_bin
|
||||
md5 bin/verilator_bin_dbg
|
||||
stat bin/verilator_bin
|
||||
stat bin/verilator_bin_dbg
|
||||
fi
|
||||
elif [ "$CI_BUILD_STAGE_NAME" = "test" ]; then
|
||||
##############################################################################
|
||||
@@ -86,9 +92,6 @@ elif [ "$CI_BUILD_STAGE_NAME" = "test" ]; then
|
||||
export VERILATOR_TEST_NO_GPROF=1 # gprof is a bit different on FreeBSD, disable
|
||||
fi
|
||||
|
||||
# Run sanitize on Ubuntu 22.04 only
|
||||
( [[ "$CI_RUNS_ON" =~ 'ubuntu-22.04' ]] || [[ "$CI_RUNS_ON" =~ 'ubuntu-24.04' ]] ) && sanitize='--sanitize' || sanitize=''
|
||||
|
||||
TEST_REGRESS=test_regress
|
||||
if [ "$CI_RELOC" == 1 ]; then
|
||||
# Testing that the installation is relocatable.
|
||||
@@ -109,16 +112,16 @@ elif [ "$CI_BUILD_STAGE_NAME" = "test" ]; then
|
||||
ccache -z
|
||||
case $TESTS in
|
||||
dist-vlt-0)
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean $sanitize" DRIVER_HASHSET=--hashset=0/4
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean" DRIVER_HASHSET=--hashset=0/4
|
||||
;;
|
||||
dist-vlt-1)
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean $sanitize" DRIVER_HASHSET=--hashset=1/4
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean" DRIVER_HASHSET=--hashset=1/4
|
||||
;;
|
||||
dist-vlt-2)
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean $sanitize" DRIVER_HASHSET=--hashset=2/4
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean" DRIVER_HASHSET=--hashset=2/4
|
||||
;;
|
||||
dist-vlt-3)
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean $sanitize" DRIVER_HASHSET=--hashset=3/4
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist --vlt --driver-clean" DRIVER_HASHSET=--hashset=3/4
|
||||
;;
|
||||
vltmt-0)
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt --driver-clean" DRIVER_HASHSET=--hashset=0/3
|
||||
@@ -129,71 +132,68 @@ elif [ "$CI_BUILD_STAGE_NAME" = "test" ]; then
|
||||
vltmt-2)
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt --driver-clean" DRIVER_HASHSET=--hashset=2/3
|
||||
;;
|
||||
coverage-all)
|
||||
nodist/code_coverage --stages 1-
|
||||
;;
|
||||
coverage-dist)
|
||||
nodist/code_coverage --stages 1- --scenarios=--dist
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--dist"
|
||||
;;
|
||||
coverage-vlt-0)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=0/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=0/10
|
||||
;;
|
||||
coverage-vlt-1)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=1/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=1/10
|
||||
;;
|
||||
coverage-vlt-2)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=2/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=2/10
|
||||
;;
|
||||
coverage-vlt-3)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=3/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=3/10
|
||||
;;
|
||||
coverage-vlt-4)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=4/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=4/10
|
||||
;;
|
||||
coverage-vlt-5)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=5/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=5/10
|
||||
;;
|
||||
coverage-vlt-6)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=6/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=6/10
|
||||
;;
|
||||
coverage-vlt-7)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=7/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=7/10
|
||||
;;
|
||||
coverage-vlt-8)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=8/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=8/10
|
||||
;;
|
||||
coverage-vlt-9)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vlt --hashset=9/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vlt" DRIVER_HASHSET=--hashset=9/10
|
||||
;;
|
||||
coverage-vltmt-0)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=0/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=0/10
|
||||
;;
|
||||
coverage-vltmt-1)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=1/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=1/10
|
||||
;;
|
||||
coverage-vltmt-2)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=2/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=2/10
|
||||
;;
|
||||
coverage-vltmt-3)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=3/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=3/10
|
||||
;;
|
||||
coverage-vltmt-4)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=4/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=4/10
|
||||
;;
|
||||
coverage-vltmt-5)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=5/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=5/10
|
||||
;;
|
||||
coverage-vltmt-6)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=6/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=6/10
|
||||
;;
|
||||
coverage-vltmt-7)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=7/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=7/10
|
||||
;;
|
||||
coverage-vltmt-8)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=8/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=8/10
|
||||
;;
|
||||
coverage-vltmt-9)
|
||||
nodist/code_coverage --stages 1- --scenarios=--vltmt --hashset=9/10
|
||||
"$MAKE" -C "$TEST_REGRESS" SCENARIOS="--vltmt" DRIVER_HASHSET=--hashset=9/10
|
||||
;;
|
||||
*)
|
||||
fatal "Unknown test: $TESTS"
|
||||
|
||||
BIN
Binary file not shown.
@@ -35,7 +35,7 @@ To change the compiler use the `-e` switch to pass environment variables:
|
||||
|
||||
::
|
||||
|
||||
docker run -ti -e CC=clang-18 -e CXX=clang++-18 verilator/verilator-buildenv test
|
||||
docker run -ti -e CXX=clang++-18 verilator/verilator-buildenv test
|
||||
|
||||
The tests, that involve numactl are not working due to security restrictions.
|
||||
To run those too, add the CAP_SYS_NICE capability during the start of the container:
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
: "${REPO:=https://github.com/verilator/verilator}"
|
||||
: "${REV:=master}"
|
||||
: "${CC:=gcc}"
|
||||
: "${CXX:=g++}"
|
||||
|
||||
SRCS=$PWD/verilator
|
||||
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
---
|
||||
# DESCRIPTION: codecov.io config
|
||||
#
|
||||
# Copyright 2020-2025 by Wilson Snyder. This program is free software; you
|
||||
# can redistribute it and/or modify it under the terms of either the GNU
|
||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||
# Version 2.0.
|
||||
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||
####################
|
||||
# Validate:
|
||||
# curl --data-binary @codecov.yml https://codecov.io/validate
|
||||
#
|
||||
codecov:
|
||||
require_ci_to_pass: false
|
||||
coverage:
|
||||
precision: 2
|
||||
round: down
|
||||
range: 50...100
|
||||
ignore:
|
||||
- "ci" #
|
||||
- "docs" #
|
||||
- "examples" #
|
||||
- "include/gtkwave" #
|
||||
- "include/vltstd" #
|
||||
- "test_regress" #
|
||||
parsers:
|
||||
gcov:
|
||||
branch_detection:
|
||||
conditional: true
|
||||
loop: true
|
||||
method: false
|
||||
macro: false
|
||||
comment:
|
||||
layout: "reach,diff,flags,tree"
|
||||
behavior: default
|
||||
require_changes: true
|
||||
+77
-32
@@ -7,10 +7,11 @@
|
||||
|
||||
# When releasing, also update header of Changes file, and CMakeLists.txt,
|
||||
# and commit using "devel release" or "Version bump" message
|
||||
# Then 'make distclean' 'autoconf' './configure' 'make' 'make test'
|
||||
# Then 'make maintainer-dist'
|
||||
#AC_INIT([Verilator],[#.### YYYY-MM-DD])
|
||||
#AC_INIT([Verilator],[#.### devel])
|
||||
AC_INIT([Verilator],[5.038 2025-07-08],
|
||||
AC_INIT([Verilator],[5.042 2025-11-02],
|
||||
[https://verilator.org],
|
||||
[verilator],[https://verilator.org])
|
||||
|
||||
@@ -56,6 +57,22 @@ AC_ARG_ENABLE([partial-static],
|
||||
CFG_ENABLE_PARTIAL_STATIC=yes)
|
||||
AC_MSG_RESULT($CFG_ENABLE_PARTIAL_STATIC)
|
||||
|
||||
# Flag to enable compiling with AddressSanitizer
|
||||
AC_MSG_CHECKING(whether to use AddressSanitizer)
|
||||
AC_ARG_ENABLE([dev-asan],
|
||||
[AS_HELP_STRING([--enable-dev-asan],
|
||||
[Enable compiling Verilator with ASAN
|
||||
AddressSanitizer for memory error detection.
|
||||
This disables tcmalloc. Does not affect
|
||||
Verilated models using ASAN.])],
|
||||
[case "${enableval}" in
|
||||
yes) CFG_WITH_DEV_ASAN=yes ;;
|
||||
no) CFG_WITH_DEV_ASAN=no ;;
|
||||
*) AC_MSG_ERROR([bad value '${enableval}' for --enable-dev-asan]) ;;
|
||||
esac],
|
||||
CFG_WITH_DEV_ASAN=no)
|
||||
AC_MSG_RESULT($CFG_WITH_DEV_ASAN)
|
||||
|
||||
# Flag to enable linking Verilator with tcmalloc if available
|
||||
AC_MSG_CHECKING(whether to use tcmalloc)
|
||||
AC_ARG_ENABLE([tcmalloc],
|
||||
@@ -68,21 +85,27 @@ AC_ARG_ENABLE([tcmalloc],
|
||||
*) AC_MSG_ERROR([bad value '${enableval}' for --enable-tcmalloc]) ;;
|
||||
esac],
|
||||
[CFG_WITH_TCMALLOC=check;])
|
||||
AC_MSG_RESULT($CFG_WITH_TCMALLOC)
|
||||
if test "$CFG_WITH_DEV_ASAN" = "yes"; then
|
||||
CFG_WITH_TCMALLOC=no
|
||||
AC_MSG_RESULT("disabled by --enable-dev-asan")
|
||||
else
|
||||
AC_MSG_RESULT($CFG_WITH_TCMALLOC)
|
||||
fi
|
||||
|
||||
# Flag to enable coverage build
|
||||
AC_MSG_CHECKING(whether to build for coverage collection)
|
||||
AC_ARG_ENABLE([coverage],
|
||||
[AS_HELP_STRING([--enable-coverage],
|
||||
[Build Verilator for code coverage collection.
|
||||
# Flag to enable code coverage build with gcov
|
||||
AC_MSG_CHECKING(whether to build for gcov code coverage collection)
|
||||
AC_ARG_ENABLE([dev-gcov],
|
||||
[AS_HELP_STRING([--enable-dev-gcov],
|
||||
[Build Verilator for code coverage collection with gcov.
|
||||
For developers only.])],
|
||||
[case "${enableval}" in
|
||||
yes) CFG_ENABLE_COVERAGE=yes ;;
|
||||
no) CFG_ENABLE_COVERAGE=no ;;
|
||||
*) AC_MSG_ERROR([bad value '${enableval}' for --enable-coverage]) ;;
|
||||
yes) CFG_WITH_DEV_GCOV=yes ;;
|
||||
no) CFG_WITH_DEV_GCOV=no ;;
|
||||
*) AC_MSG_ERROR([bad value '${enableval}' for --enable-dev-gcov]) ;;
|
||||
esac],
|
||||
CFG_ENABLE_COVERAGE=no)
|
||||
AC_MSG_RESULT($CFG_ENABLE_COVERAGE)
|
||||
CFG_WITH_DEV_GCOV=no)
|
||||
AC_SUBST(CFG_WITH_DEV_GCOV)
|
||||
AC_MSG_RESULT($CFG_WITH_DEV_GCOV)
|
||||
|
||||
# Special Substitutions - CFG_WITH_DEFENV
|
||||
AC_MSG_CHECKING(whether to use hardcoded paths)
|
||||
@@ -177,7 +200,7 @@ AC_PROG_INSTALL
|
||||
|
||||
AC_LANG_PUSH(C++)
|
||||
CFG_CXX_VERSION=`$CXX --version | head -1`
|
||||
AC_MSG_RESULT([compiler $CXX --version = $CFG_CXX_VERSION])
|
||||
AC_MSG_RESULT([compiler version... $CXX --version = $CFG_CXX_VERSION])
|
||||
AC_SUBST(CFG_CXX_VERSION)
|
||||
|
||||
AC_MSG_CHECKING([that C++ compiler can compile simple program])
|
||||
@@ -377,7 +400,7 @@ AC_DEFUN([_MY_LDLIBS_CHECK_OPT],
|
||||
])
|
||||
|
||||
# Add the coverage flags early as they influence later checks.
|
||||
if test "$CFG_ENABLE_COVERAGE" = "yes"; then
|
||||
if test "$CFG_WITH_DEV_GCOV" = "yes"; then
|
||||
_MY_CXX_CHECK_OPT(CXX,--coverage)
|
||||
# Otherwise inline may not show as uncovered
|
||||
# If we use this then e.g. verilated.h functions properly show up
|
||||
@@ -389,11 +412,19 @@ if test "$CFG_ENABLE_COVERAGE" = "yes"; then
|
||||
# _MY_CXX_CHECK_OPT(CXX,-fkeep-inline-functions)
|
||||
# Otherwise static may not show as uncovered
|
||||
_MY_CXX_CHECK_OPT(CXX,-fkeep-static-functions)
|
||||
# Exceptions can pollute the branch coverage data
|
||||
_MY_CXX_CHECK_OPT(CXX,-fno-exceptions)
|
||||
# Define-out some impossible stuff
|
||||
# Similarly for inline functions. - This is too slow. See Makefile_obj instead.
|
||||
#_MY_CXX_CHECK_OPT(CXX,-fkeep-inline-functions)
|
||||
# Make sure profiling is thread-safe
|
||||
_MY_CXX_CHECK_OPT(CXX,-fprofile-update=atomic)
|
||||
# Ensure data files can be written from parallel runs
|
||||
_MY_CXX_CHECK_OPT(CXX,-fprofile-reproducible=parallel-runs)
|
||||
# Save source files as absolute paths in gcno files
|
||||
_MY_CXX_CHECK_OPT(CXX,-fprofile-abs-path)
|
||||
# Define so compiled code can know
|
||||
_MY_CXX_CHECK_OPT(CXX,-DVL_GCOV)
|
||||
AC_DEFINE([HAVE_DEV_GCOV],[1],[Defined if compiled with code coverage collection for gcov])]
|
||||
fi
|
||||
AC_SUBST(HAVE_DEV_GCOV)
|
||||
|
||||
# Compiler flags to enable profiling
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PROFILE,-pg)
|
||||
@@ -431,6 +462,14 @@ AC_SUBST(CFG_CXXFLAGS_COROUTINES)
|
||||
AC_SUBST(HAVE_COROUTINES)
|
||||
|
||||
# Flags for compiling Verilator internals including parser always
|
||||
if test "$CFG_WITH_DEV_ASAN" = "yes"; then
|
||||
_MY_CXX_CHECK_IFELSE(-fsanitize=address -DVL_ASAN,
|
||||
[CFG_CXXFLAGS_SRC="$CFG_CXXFLAGS_SRC -fsanitize=address -DVL_ASAN"
|
||||
CFG_LDFLAGS_SRC="$CFG_LDFLAGS_SRC -fsanitize=address"
|
||||
AC_DEFINE([HAVE_DEV_ASAN],[1],[Defined if built with AddresSanitizer])]
|
||||
)
|
||||
fi
|
||||
AC_SUBST(HAVE_DEV_ASAN)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Qunused-arguments)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-shadow)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-unused-parameter)
|
||||
@@ -446,16 +485,22 @@ _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PARSER,-Wno-unused)
|
||||
AC_SUBST(CFG_CXXFLAGS_PARSER)
|
||||
|
||||
# Flags for compiling the debug version of Verilator (in addition to above CFG_CXXFLAGS_SRC)
|
||||
if test "$CFG_ENABLE_COVERAGE" = "no"; then # Do not optimize for the coverage build
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DEBUG,-Og)
|
||||
if test "$CFG_WITH_DEV_GCOV" = "no"; then # Do not optimize for the coverage build
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DBG,-Og)
|
||||
fi
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DEBUG,-ggdb)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DEBUG,-gz)
|
||||
AC_SUBST(CFG_CXXFLAGS_DEBUG)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DBG,-ggdb)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DBG,-gz)
|
||||
AC_SUBST(CFG_CXXFLAGS_DBG)
|
||||
|
||||
# Flags for linking the debug version of Verilator (in addition to above CFG_LDFLAGS_SRC)
|
||||
_MY_LDLIBS_CHECK_OPT(CFG_LDFLAGS_DEBUG,-gz)
|
||||
AC_SUBST(CFG_LDFLAGS_DEBUG)
|
||||
_MY_LDLIBS_CHECK_OPT(CFG_LDFLAGS_DBG,-gz)
|
||||
AC_SUBST(CFG_LDFLAGS_DBG)
|
||||
|
||||
# Flags for compiling the optimized version of Verilator (in addition to above CFG_CXXFLAGS_SRC)
|
||||
if test "$CFG_WITH_DEV_GCOV" = "no"; then # Do not optimize for the coverage build
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_OPT,-O3)
|
||||
fi
|
||||
AC_SUBST(CFG_CXXFLAGS_OPT)
|
||||
|
||||
# Flags for Verilated makefile
|
||||
# For example, -Wno-div-by-zero isn't in 4.1.2
|
||||
@@ -476,6 +521,7 @@ m4_foreach([cflag],[
|
||||
[-Wno-bool-operation],
|
||||
[-Wno-c++11-narrowing],
|
||||
[-Wno-constant-logical-operand],
|
||||
[-Wno-int-in-bool-context],
|
||||
[-Wno-non-pod-varargs],
|
||||
[-Wno-parentheses-equality],
|
||||
[-Wno-shadow],
|
||||
@@ -546,10 +592,12 @@ _MY_LDLIBS_CHECK_IFELSE(
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-calloc)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-realloc)
|
||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-builtin-free)
|
||||
AC_DEFINE([HAVE_TCMALLOC],[1],[Defined if have tcmalloc])
|
||||
fi],
|
||||
[if test "$CFG_WITH_TCMALLOC" = "yes"; then
|
||||
AC_MSG_ERROR([--enable-tcmalloc was given but test for ${LTCMALLOC} failed])
|
||||
fi])
|
||||
AC_SUBST(HAVE_TCMALLOC)
|
||||
AC_SUBST(CFG_LIBS)
|
||||
|
||||
# Need C++14 at least
|
||||
@@ -557,18 +605,15 @@ AC_SUBST(CFG_LIBS)
|
||||
AC_DEFUN([_MY_CXX_CHECK_CXX_VER],
|
||||
[# _MY_CXX_CHECK_CXX_VER(flag) -- Check if compiler runs C++14
|
||||
# Set $_my_result
|
||||
AC_LINK_IFELSE(
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([#include <thread>
|
||||
#if (__cplusplus < 201402L)
|
||||
# error "Too old"
|
||||
#endif
|
||||
], [[ ]])],
|
||||
[_my_result=yes
|
||||
if test -s conftest.err; then
|
||||
if grep -e "$1" conftest.err >/dev/null; then
|
||||
_my_result=no
|
||||
fi
|
||||
fi],
|
||||
], [[
|
||||
]])],
|
||||
[_my_result=yes],
|
||||
[_my_result=no],
|
||||
[_my_result=no])
|
||||
])
|
||||
|
||||
|
||||
+16
-2
@@ -7,7 +7,7 @@ Please see the Verilator manual for 200+ additional contributors. Thanks to all.
|
||||
Adam Bagley
|
||||
Adrian Sampson
|
||||
Adrien Le Masle
|
||||
Ahmed El-Mahmoudy
|
||||
أحمد المحمودي (Ahmed El-Mahmoudy)
|
||||
Aidan McNay
|
||||
Aleksander Kiryk
|
||||
Alex Chadwick
|
||||
@@ -24,6 +24,7 @@ Anthony Donlon
|
||||
Anthony Moore
|
||||
Arkadiusz Kozdra
|
||||
Arthur Rosa
|
||||
Artur Bieniek
|
||||
Aylon Chaim Porat
|
||||
Bartłomiej Chmiel
|
||||
Brian Li
|
||||
@@ -31,12 +32,15 @@ Cameron Kirk
|
||||
Chih-Mao Chen
|
||||
Chris Bachhuber
|
||||
Chris Randall
|
||||
Christian Hecken
|
||||
Christopher Taylor
|
||||
Chuxuan Wang
|
||||
Chykon
|
||||
Congcong Cai
|
||||
Conor McCullough
|
||||
Dan Petrisko
|
||||
Daniel Bates
|
||||
Danny Oler
|
||||
Dave Sargeant
|
||||
David Horton
|
||||
David Ledger
|
||||
@@ -55,7 +59,7 @@ Eric Müller
|
||||
Eric Rippey
|
||||
Ethan Sifferman
|
||||
Eyck Jentzsch
|
||||
Fabian Keßler
|
||||
Fabian Keßler-Schulz
|
||||
Fan Shupei
|
||||
Felix Neumärker
|
||||
Felix Yan
|
||||
@@ -64,6 +68,7 @@ Fuad Ismail
|
||||
Furqan Nadir
|
||||
G-A. Kamendje
|
||||
Garrett Smith
|
||||
George Polack
|
||||
Geza Lore
|
||||
Gianfranco Costamagna
|
||||
Gijs Burghoorn
|
||||
@@ -83,12 +88,14 @@ Huang Rui
|
||||
Huanghuang Zhou
|
||||
HungMingWu
|
||||
HyungKi Jeong
|
||||
Ibrahim Burak Yorulmaz
|
||||
Igor Zaworski
|
||||
Ilya Barkov
|
||||
Iru Cai
|
||||
Ivan Vnučec
|
||||
Iztok Jeras
|
||||
Jake Merdich
|
||||
Jakub Wasilewski
|
||||
James Bailey
|
||||
James Hanlon
|
||||
James Hutchinson
|
||||
@@ -139,6 +146,7 @@ Krzysztof Obłonczek
|
||||
Krzysztof Starecki
|
||||
Krzysztof Sychla
|
||||
Kuba Ober
|
||||
Lan Zongwei
|
||||
Larry Doolittle
|
||||
Liam Braun
|
||||
Luca Colagrande
|
||||
@@ -155,7 +163,10 @@ Marshal Qiao
|
||||
Martin Schmidt
|
||||
Martin Stadler
|
||||
Mateusz Gancarz
|
||||
Matt Stroud
|
||||
Matthew Ballance
|
||||
Max Wipfli
|
||||
Michael Bedford Taylor
|
||||
Michael Bikovitsky
|
||||
Michael Killough
|
||||
Michal Czyz
|
||||
@@ -201,12 +212,14 @@ Richard Myers
|
||||
Risto Pejašinović
|
||||
Robert Balas
|
||||
Robin Heinemann
|
||||
Rodrigo Batista de Moraes
|
||||
Rupert Swarbrick
|
||||
Ryan Ziegler
|
||||
Ryszard Rozak
|
||||
Samuel Riedel
|
||||
Sean Cross
|
||||
Sebastien Van Cauwenberghe
|
||||
Sergey Fedorov
|
||||
Sergi Granell
|
||||
Seth Pellegrino
|
||||
Shou-Li Hsu
|
||||
@@ -257,6 +270,7 @@ Zhen Yan
|
||||
Zhou Shen
|
||||
Zhouyi Shen
|
||||
Zixi Li
|
||||
dependabot[bot]
|
||||
february cozzocrea
|
||||
sumpster
|
||||
Àlex Torregrosa
|
||||
|
||||
+6
-1
@@ -68,11 +68,16 @@ pdf:
|
||||
|
||||
######################################################################
|
||||
|
||||
html latex linkcheck spelling::
|
||||
html latex linkcheck::
|
||||
$(MAKE) vl-extract
|
||||
$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
|
||||
$(PYTHON3) bin/vl_sphinx_fix _build
|
||||
|
||||
spelling::
|
||||
$(MAKE) vl-extract
|
||||
$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
|
||||
sort -o guide/spelling.txt guide/spelling.txt
|
||||
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# mypy: disallow-untyped-defs
|
||||
# pylint: disable=C0112,C0114,C0115,C0116,C0209,C0301,R0903
|
||||
# -*- Python -*- See copyright, etc below
|
||||
######################################################################
|
||||
@@ -11,9 +12,8 @@ import re
|
||||
|
||||
class VlSphinxExtract:
|
||||
debug = 0
|
||||
SkipBasenames = {}
|
||||
|
||||
def process(self, filename):
|
||||
def process(self, filename: str) -> None:
|
||||
with open(filename, "r", encoding="utf8") as fhr:
|
||||
fhw = None
|
||||
for line in fhr:
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# mypy: disallow-untyped-defs
|
||||
# pylint: disable=C0112,C0114,C0115,C0116,C0209,C0301,R0903
|
||||
# -*- Python -*- See copyright, etc below
|
||||
######################################################################
|
||||
@@ -12,19 +13,17 @@ import re
|
||||
|
||||
class VlSphinxFix:
|
||||
debug = 0
|
||||
SkipBasenames = {}
|
||||
|
||||
def process(self, path):
|
||||
def process(self, path: str) -> None:
|
||||
if os.path.isdir(path):
|
||||
for basefile in os.listdir(path):
|
||||
file = os.path.join(path, basefile)
|
||||
if ((basefile != ".") and (basefile != "..") and basefile not in self.SkipBasenames
|
||||
and not os.path.islink(file)):
|
||||
if ((basefile != ".") and (basefile != "..") and not os.path.islink(file)):
|
||||
self.process(file)
|
||||
elif re.search(r'\.(html|tex)$', path):
|
||||
self._edit(path)
|
||||
|
||||
def _edit(self, filename):
|
||||
def _edit(self, filename: str) -> None:
|
||||
is_html = re.search(r'\.(html)$', filename)
|
||||
with open(filename, "r", encoding="utf8") as fhr:
|
||||
origfile = fhr.read()
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
.. comment: generated by t_event_control_star_never_bad
|
||||
.. code-block:: sv
|
||||
|
||||
always @* a = 100;
|
||||
@@ -0,0 +1,4 @@
|
||||
.. comment: generated by t_event_control_star_never_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-ALWNEVER: example.v:1:3 'always @*' will never execute as expression list is empty (no variables read)
|
||||
@@ -0,0 +1,9 @@
|
||||
.. comment: generated by t_lint_assigneqexpr_bad
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
:emphasize-lines: 3
|
||||
|
||||
assign d_o = // Note = not == below
|
||||
(
|
||||
c_o = 1 // <--- Warning: ASSIGNEQEXPR
|
||||
) ? 1 : (
|
||||
@@ -0,0 +1,5 @@
|
||||
.. comment: generated by t_lint_assigneqexpr_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-ASSIGNEQEXPR: example.v:1:11 Assignment '=' inside expression
|
||||
: ... Was a '==' intended, or suggest use a separate statement
|
||||
@@ -2,4 +2,4 @@
|
||||
.. code-block:: sv
|
||||
:emphasize-lines: 1
|
||||
|
||||
// verilator lintt_off WIDTH //<--- Warning (lint_off misspelled)
|
||||
// verilator lintt_off WIDTH //<--- Warning (lint_off misspelled)
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
.. code-block::
|
||||
:emphasize-lines: 1,2
|
||||
|
||||
%Error-BADVLTPRAGMA: example.v:1:4 Unknown verilator comment: '/*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/'
|
||||
7 | /*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
%Error-BADVLTPRAGMA: example.v:1:3 Unknown verilator comment: '/*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/'
|
||||
7 | /*verilator lintt_off WIDTH <--- Warning (lint_off misspelled)*/
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
|
||||
always_comb b = ~a;
|
||||
always_comb a = b;
|
||||
always_comb b = ~a;
|
||||
always_comb a = b;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.. comment: generated by t_lint_didnotconverge_bad
|
||||
.. code-block::
|
||||
|
||||
-V{t#,#} 'stl' region trigger index 1 is active: @([hybrid] a)
|
||||
%Error: t/t_lint_didnotconverge_bad.v:7: Settle region did not converge.
|
||||
-V{t#,#} 'stl' region trigger index 0 is active: @([hybrid] a)
|
||||
%Error: t/t_lint_didnotconverge_bad.v:7: Settle region did not converge after 100 tries
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_lint_didnotconverge_nodbg_bad
|
||||
.. code-block::
|
||||
|
||||
%Error: t/t_lint_didnotconverge_bad.v:7: Settle region did not converge.
|
||||
%Error: t/t_lint_didnotconverge_bad.v:7: Settle region did not converge after 100 tries
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
.. comment: generated by t_lint_functimectl_bad
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
:emphasize-lines: 2
|
||||
|
||||
function void calls_timing_ctl;
|
||||
@e; // <--- Bad IEEE 1800-2023 13.4 time-controlling
|
||||
@@ -0,0 +1,4 @@
|
||||
.. comment: generated by t_lint_functimectl_bad
|
||||
.. code-block::
|
||||
|
||||
%Error-FUNCTIMECTL: example.v:1:5 Functions cannot contain time-controlling statements (IEEE 1800-2023 13.4)
|
||||
@@ -0,0 +1,8 @@
|
||||
.. comment: generated by t_param_hier_bad
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
:emphasize-lines: 3
|
||||
|
||||
sub #(.X(MY_X)) u_sub ();
|
||||
|
||||
localparam int SUB_Y = u_sub.Y; // <--- BAD: IEEE 1800-2023 6.20.2 no hierarchical
|
||||
@@ -0,0 +1,7 @@
|
||||
.. comment: generated by t_param_hier_bad
|
||||
.. code-block::
|
||||
|
||||
%Error-HIERPARAM: example.v:1:32 Parameter values cannot use hierarchical values (IEEE 1800-2023 6.20.2)
|
||||
: ... note: In instance 't'
|
||||
36 | localparam int SUB_Y = u_sub.Y;
|
||||
| ^
|
||||
@@ -3,9 +3,9 @@
|
||||
:linenos:
|
||||
:emphasize-lines: 2,5
|
||||
|
||||
always @(posedge clk) begin
|
||||
out2[7:0] <= d0; // <--- Warning
|
||||
end
|
||||
always @(negedge clk) begin
|
||||
out2[15:8] <= d0; // <--- Warning
|
||||
end
|
||||
always @(posedge clk) begin
|
||||
out2[7:0] <= d0; // <--- Warning
|
||||
end
|
||||
always @(negedge clk) begin
|
||||
out2[15:8] <= d0; // <--- Warning
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.. comment: generated by t_lint_multidriven_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-MULTIDRIVEN: example.v:1:22 Signal has multiple driving blocks with different clocking: 'out2'
|
||||
example.v:1:7 ... Location of first driving block
|
||||
example.v:1:7 ... Location of other driving block
|
||||
%Warning-MULTIDRIVEN: example.v:1:21 Signal has multiple driving blocks with different clocking: 'out2'
|
||||
example.v:1:5 ... Location of first driving block
|
||||
example.v:1:5 ... Location of other driving block
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
.. comment: generated by t_lint_noreturn_bad
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
:emphasize-lines: 1
|
||||
|
||||
function int no_rtn(); // <--- Warning: No return
|
||||
endfunction
|
||||
@@ -0,0 +1,4 @@
|
||||
.. comment: generated by t_lint_noreturn_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-NORETURN: example.v:1:16 Non-void function 'no_rtn' has no return value
|
||||
@@ -0,0 +1,7 @@
|
||||
.. comment: generated by t_lint_paramnodefault_bad
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
:emphasize-lines: 2
|
||||
|
||||
module sub;
|
||||
parameter NODEF; //<--- Warning
|
||||
@@ -0,0 +1,6 @@
|
||||
.. comment: generated by t_lint_paramnodefault_bad
|
||||
.. code-block::
|
||||
|
||||
%Error-PARAMNODEFAULT: example.v:1:13 Parameter without default requires ANSI-style parameter list (IEEE 1800-2023 6.20.1): 'NODEF'
|
||||
8 | parameter NODEF;
|
||||
| ^~~~~
|
||||
@@ -3,10 +3,10 @@
|
||||
:linenos:
|
||||
:emphasize-lines: 1,5
|
||||
|
||||
logic flop_out = 1; // <--- Warning
|
||||
logic flop_out = 1; // <--- Warning
|
||||
|
||||
always @(posedge clk, negedge reset_l) begin
|
||||
if (enable) begin
|
||||
flop_out <= ~in; // <--- Use of initialized
|
||||
end
|
||||
end
|
||||
always @(posedge clk, negedge reset_l) begin
|
||||
if (enable) begin
|
||||
flop_out <= ~in; // <--- Use of initialized
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
:linenos:
|
||||
:emphasize-lines: 5
|
||||
|
||||
logic flop2_out;
|
||||
logic flop2_out;
|
||||
|
||||
always @(posedge clk, negedge reset_l) begin
|
||||
if (!reset_l) begin
|
||||
flop2_out <= '1; // <--- Added reset init
|
||||
end
|
||||
else if (enable) begin
|
||||
flop2_out <= ~in;
|
||||
end
|
||||
end
|
||||
always @(posedge clk, negedge reset_l) begin
|
||||
if (!reset_l) begin
|
||||
flop2_out <= '1; // <--- Added reset init
|
||||
end
|
||||
else if (enable) begin
|
||||
flop2_out <= ~in;
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.. comment: generated by t_lint_procassinit_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-PROCASSINIT: example.v:1:21 Procedural assignment to declaration with initial value: 'flop_out'
|
||||
%Warning-PROCASSINIT: example.v:1:20 Procedural assignment to declaration with initial value: 'flop_out'
|
||||
: ... note: In instance 't'
|
||||
: ... Location of variable initialization
|
||||
26 | logic flop_out = 1;
|
||||
| ^
|
||||
example.v:1:10 ... Location of variable process write
|
||||
: ... Perhaps should initialize instead using a reset in this process
|
||||
30 | flop_out <= ~in;
|
||||
| ^~~~~~~~
|
||||
26 | logic flop_out = 1;
|
||||
| ^
|
||||
example.v:1:7 ... Location of variable process write
|
||||
: ... Perhaps should initialize instead using a reset in this process
|
||||
30 | flop_out <= ~in;
|
||||
| ^~~~~~~~
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
.. code-block:: sv
|
||||
:emphasize-lines: 1
|
||||
|
||||
#100 $finish; //<--- Warning
|
||||
#100 $finish; //<--- Warning
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_lint_stmtdly_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-STMTDLY: example.v:1:7 Ignoring delay on this statement due to --no-timing
|
||||
%Warning-STMTDLY: example.v:1:5 Ignoring delay on this statement due to --no-timing
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block:: sv
|
||||
|
||||
$error("User elaboration-time error");
|
||||
$error("User elaboration-time error");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-USERERROR: example.v:1:7 User elaboration-time error
|
||||
%Warning-USERERROR: example.v:1:5 User elaboration-time error
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block:: sv
|
||||
|
||||
$fatal(0, "User elaboration-time fatal");
|
||||
$fatal(0, "User elaboration-time fatal");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-USERFATAL: example.v:1:7 User elaboration-time fatal
|
||||
%Warning-USERFATAL: example.v:1:5 User elaboration-time fatal
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block:: sv
|
||||
|
||||
$info("User elaboration-time info");
|
||||
$info("User elaboration-time info");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block::
|
||||
|
||||
-Info: example.v:1:7 User elaboration-time info
|
||||
-Info: example.v:1:5 User elaboration-time info
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block:: sv
|
||||
|
||||
$warning("User elaboration-time warning");
|
||||
$warning("User elaboration-time warning");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_assert_comp_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-USERWARN: example.v:1:7 User elaboration-time warning
|
||||
%Warning-USERWARN: example.v:1:5 User elaboration-time warning
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
:emphasize-lines: 2
|
||||
|
||||
module t;
|
||||
integer t; //<--- Warning ('t' hidden by module 't')
|
||||
integer t; //<--- Warning ('t' hidden by module 't')
|
||||
endmodule
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.. comment: generated by t_var_bad_hide_docs
|
||||
.. code-block::
|
||||
|
||||
%Warning-VARHIDDEN: example.v:2:12 Declaration of signal hides declaration in upper scope: 't'
|
||||
%Warning-VARHIDDEN: example.v:2:11 Declaration of signal hides declaration in upper scope: 't'
|
||||
example.v:1:8 ... Location of original declaration
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
:linenos:
|
||||
:emphasize-lines: 3
|
||||
|
||||
int array[5];
|
||||
bit [1:0] rd_addr;
|
||||
wire int rd_value = array[rd_addr]; //<--- Warning
|
||||
logic [31:0] array[5];
|
||||
bit [1:0] rd_addr;
|
||||
wire [31:0] rd_value = array[rd_addr]; //<--- Warning
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
.. code-block:: sv
|
||||
:emphasize-lines: 1
|
||||
|
||||
wire int rd_value = array[{1'b0, rd_addr}]; //<--- Fixed
|
||||
wire [31:0] rd_value = array[{1'b0, rd_addr}]; //<--- Fixed
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. comment: generated by t_lint_widthexpand_docs_bad
|
||||
.. code-block::
|
||||
|
||||
%Warning-WIDTHEXPAND: example.v:3:29 Bit extraction of array[4:0] requires 3 bit index, not 2 bits.
|
||||
%Warning-WIDTHEXPAND: example.v:3:31 Bit extraction of array[4:0] requires 3 bit index, not 2 bits.
|
||||
|
||||
+11
-2
@@ -63,12 +63,19 @@ rst_prolog = """
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
#
|
||||
# To install:
|
||||
# sudo install enchant
|
||||
# sudo pip3 install sphinx sphinx_rtd_theme breathe sphinxcontrib-spelling
|
||||
# We keep this list empty for now to avoid needing dependencies
|
||||
# python3 -m venv --system-site-packages ~/.verilator_pyenv
|
||||
# source ~/.verilator_pyenv/bin/activate
|
||||
# pip3 install sphinx sphinx_rtd_theme sphinxcontrib-spelling breathe
|
||||
#
|
||||
# We keep this extensions list empty for now to avoid needing dependencies
|
||||
extensions = []
|
||||
# extensions = ['breathe', 'sphinxcontrib.spelling']
|
||||
# For website builds, this will add sphinxcontrib.jquery
|
||||
if 'VERILATOR_SPHINX_EXTENSIONS' in os.environ:
|
||||
extensions.extend(os.environ.get('VERILATOR_SPHINX_EXTENSIONS', '').split(':'))
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
@@ -110,6 +117,8 @@ html_domain_indices = False
|
||||
html_logo = "../_static/verilator_192_150_min.png"
|
||||
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
# Despite a 'WARNING: Calling get_html_theme_path is deprecated'
|
||||
# the HTML output is different without this line
|
||||
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
|
||||
|
||||
html_theme_options = {
|
||||
|
||||
+10
-10
@@ -184,7 +184,7 @@ Verilog, put in our.v:
|
||||
import "DPI-C" function int add (input int a, input int b);
|
||||
|
||||
initial begin
|
||||
$display("%x + %x = %x", 1, 2, add(1,2));
|
||||
$display("%x + %x = %x", 1, 2, add(1,2));
|
||||
endtask
|
||||
|
||||
Then after Verilating, Verilator will create a file Vour__Dpi.h with the
|
||||
@@ -225,8 +225,8 @@ called from C++:
|
||||
export "DPI-C" task publicSetBool;
|
||||
|
||||
task publicSetBool;
|
||||
input bit in_bool;
|
||||
var_bool = in_bool;
|
||||
input bit in_bool;
|
||||
var_bool = in_bool;
|
||||
endtask
|
||||
|
||||
Then after Verilating, Verilator will create a file Vour__Dpi.h with the
|
||||
@@ -294,11 +294,11 @@ wrapper:
|
||||
import "DPI-C" context function void dpi_that_accesses_din();
|
||||
|
||||
always @(...)
|
||||
dpi_din_args(din);
|
||||
dpi_din_args(din);
|
||||
|
||||
task dpi_din_args(input din);
|
||||
/* verilator no_inline_task */
|
||||
dpi_that_accesses_din();
|
||||
// verilator no_inline_task
|
||||
dpi_that_accesses_din();
|
||||
endtask
|
||||
|
||||
|
||||
@@ -423,9 +423,9 @@ be deferred for later. These delayed values can be flushed to the model with
|
||||
VPI Example
|
||||
-----------
|
||||
|
||||
In the below example, we have readme marked read-only, and writeme which if
|
||||
written from outside the model will have the same semantics as if it
|
||||
changed on the specified clock edge.
|
||||
In the below example, we have readme marked read-only, and writeme marked
|
||||
read-write which if written from outside the model will have the same semantics
|
||||
as if it was a top level input.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@@ -434,7 +434,7 @@ changed on the specified clock edge.
|
||||
parameter WIDTH /*verilator public_flat_rd*/ = 32
|
||||
) (input clk);
|
||||
reg [WIDTH-1:0] readme /*verilator public_flat_rd*/;
|
||||
reg [WIDTH-1:0] writeme /*verilator public_flat_rw @(posedge clk) */;
|
||||
reg [WIDTH-1:0] writeme /*verilator public_flat_rw*/;
|
||||
initial $finish;
|
||||
endmodule
|
||||
EOF
|
||||
|
||||
@@ -77,9 +77,10 @@ reduce a SystemVerilog design to the smallest possible reproducer.
|
||||
It can be used to automatically reduce a design with hundreds of thousands of
|
||||
lines to a minimal test case while preserving the bug-inducing behavior.
|
||||
|
||||
With :vlopt:`--debug`, Verilator will write a *{prefix}*\ __inputs\ .vpp
|
||||
file which has all of the individual input files combined and
|
||||
pre-processed, this is often useful as the input design into `sv-bugpoint`.
|
||||
With :vlopt:`--debug` or :vlopt:`--dump-inputs`, Verilator will write a
|
||||
*{prefix}*\ __inputs\ .vpp file which has all of the individual input files
|
||||
combined and pre-processed, this is often useful as the input design into
|
||||
`sv-bugpoint`.
|
||||
|
||||
Please refer to `sv-bugpoint README
|
||||
<https://github.com/antmicro/sv-bugpoint/blob/main/README.md>`_ for more
|
||||
|
||||
@@ -13,8 +13,8 @@ When possible, please instead report bugs at `Verilator Issues
|
||||
|
||||
The primary author is Wilson Snyder <[email protected]>.
|
||||
|
||||
Major concepts by Paul Wasson, Duane Galbi, John Coiner, Geza Lore, Yutetsu
|
||||
Takatsukasa, and Jie Xu.
|
||||
Major concepts by Krzysztof Bieganski, John Coiner, Duane Galbi, Geza Lore,
|
||||
Ryszard Rozak, Yutetsu Takatsukasa, Paul Wasson, and Jie Xu.
|
||||
|
||||
|
||||
Contributors
|
||||
|
||||
@@ -20,3 +20,9 @@ C++14 compiler support
|
||||
XML output
|
||||
Verilator currently supports XML parser output (enabled with `--xml-only`).
|
||||
Support for `--xml-*` options will be deprecated no sooner than January 2026.
|
||||
|
||||
--make cmake
|
||||
The `--make cmake` options is deprecated and will be removed no sooner than
|
||||
January 2026. Use `--make json` instead. Note that the CMake integration
|
||||
shipping with Verilator (verilator-config.mk) already uses `--make json` so
|
||||
no changes are necessary if using that.
|
||||
|
||||
+153
-49
@@ -32,7 +32,9 @@ Summary:
|
||||
makefile's VPATH the appropriate directory to find the file.
|
||||
|
||||
See also :vlopt:`-CFLAGS` and :vlopt:`-LDFLAGS` options, which are
|
||||
useful when the C++ files need special compiler flags.
|
||||
useful when the C++ files need special compiler flags. The compiler
|
||||
flags add by default `-DVERILATOR=1`, so an `#ifdef VERILATOR` may be
|
||||
used to conditionally preprocess .cpp code for different simulators.
|
||||
|
||||
.. option:: <file.v>
|
||||
|
||||
@@ -86,12 +88,23 @@ Summary:
|
||||
grammar and other semantic extensions which might not be legal when
|
||||
set to an older standard.
|
||||
|
||||
.. option:: --aslr
|
||||
|
||||
.. option:: --no-aslr
|
||||
|
||||
Rarely needed - for developer use. With `--aslr`, do not change the
|
||||
system default as to using Linux address space layout randomization
|
||||
(ASLR). With `--no-aslr` attempt to disable ASLR. If not specified,
|
||||
ASLR will be disabled only when using :vlopt:`--debug` (or similar
|
||||
debug-related options), so that pointers have more deterministic values,
|
||||
aiding repeatability.
|
||||
|
||||
.. option:: --no-assert
|
||||
|
||||
Disable all assertions. Implies :vlopt:`--no-assert-case`.
|
||||
|
||||
In versions before 5.038, these were disabled by default, and `--assert`
|
||||
was required to enable assertions.
|
||||
In versions before 5.038, assertions were disabled by default, and
|
||||
`--assert` was required to enable assertions.
|
||||
|
||||
.. option:: --no-assert-case
|
||||
|
||||
@@ -155,10 +168,11 @@ Summary:
|
||||
|
||||
.. option:: --build-jobs <value>
|
||||
|
||||
Specify the level of parallelism for :vlopt:`--build`. If zero, uses the
|
||||
number of threads in the current hardware. Otherwise, the <value> must
|
||||
be a positive integer specifying the maximum number of parallel build
|
||||
jobs.
|
||||
Specify the level of parallelism for :vlopt:`--build`. If zero, uses the
|
||||
number of threads available to the process, which is the number of threads
|
||||
assigned by processor affinity (e.g. using `numactl`), or the number of
|
||||
threads in the host hardware if unspecified. Otherwise, the <value> must be
|
||||
a positive integer specifying the maximum number of parallel build jobs.
|
||||
|
||||
If not provided, and :vlopt:`-j` is provided, the :vlopt:`-j` value is
|
||||
used.
|
||||
@@ -186,6 +200,10 @@ Summary:
|
||||
|
||||
.. option:: --clk <signal-name>
|
||||
|
||||
Deprecated and has no effect (ignored).
|
||||
|
||||
In versions before 5.042:
|
||||
|
||||
With :vlopt:`--clk`, the specified signal is marked as a clock signal.
|
||||
|
||||
The provided signal name is specified using a RTL hierarchy path. For
|
||||
@@ -206,6 +224,10 @@ Summary:
|
||||
|
||||
.. option:: --no-clk <signal-name>
|
||||
|
||||
Deprecated and has no effect (ignored).
|
||||
|
||||
In versions before 5.042:
|
||||
|
||||
Prevent the specified signal from being marked as a clock. See
|
||||
:vlopt:`--clk`.
|
||||
|
||||
@@ -448,6 +470,11 @@ Summary:
|
||||
level 3. Before Verilator 4.228, :vlopt:`--dump-tree` used
|
||||
to include this option.
|
||||
|
||||
.. option:: --dump-inputs
|
||||
|
||||
Rarely needed. Enable dumping a *{prefix}*\ __inputs\ .vpp file which
|
||||
has all of the individual input files combined and pre-processed
|
||||
|
||||
.. option:: --dump-tree
|
||||
|
||||
Rarely needed. Enable dumping Ast .tree debug files with dumping level 3,
|
||||
@@ -512,8 +539,8 @@ Summary:
|
||||
out. Beware of enabling debugging messages, as they will also go to
|
||||
standard out. See :vlopt:`--no-std`, which is implied by this.
|
||||
|
||||
See also :vlopt:`--dump-defines`, :vlopt:`-P`, :vlopt:`--pp-comments`
|
||||
and :vlopt:`--preproc-resolve` options.
|
||||
See also :vlopt:`--dump-defines`, :vlopt:`-P`,
|
||||
:vlopt:`--preproc-comments` and :vlopt:`--preproc-resolve` options.
|
||||
|
||||
.. option:: --emit-accessors
|
||||
|
||||
@@ -562,6 +589,10 @@ Summary:
|
||||
Any :code:`$VAR`, :code:`$(VAR)`, or :code:`${VAR}` will be replaced
|
||||
with the specified environment variable.
|
||||
|
||||
.. option:: -fdfg-synthesize-all
|
||||
|
||||
Rarely needed. Attempt to synthesize all combinational logic in DFG.
|
||||
|
||||
.. option:: -FI <file>
|
||||
|
||||
Force include of the specified C++ header file. All generated C++ files
|
||||
@@ -598,6 +629,10 @@ Summary:
|
||||
|
||||
.. option:: -fno-const-eager
|
||||
|
||||
.. option:: -fno-dead-assigns
|
||||
|
||||
.. option:: -fno-dead-cells
|
||||
|
||||
.. option:: -fno-dedup
|
||||
|
||||
.. option:: -fno-dfg
|
||||
@@ -606,6 +641,10 @@ Summary:
|
||||
optimizer. Alias for :vlopt:`-fno-dfg-pre-inline`,
|
||||
:vlopt:`-fno-dfg-post-inline` and :vlopt:`-fno-dfg-scoped`.
|
||||
|
||||
.. option:: -fno-dfg-break-cycles
|
||||
|
||||
Rarely needed. Disable breaking combinational cycles during DFG.
|
||||
|
||||
.. option:: -fno-dfg-peephole
|
||||
|
||||
Rarely needed. Disable the DFG peephole optimizer.
|
||||
@@ -762,7 +801,8 @@ Summary:
|
||||
be useful in makefiles. See also :vlopt:`-V`, and the various
|
||||
:file:`*.mk` files.
|
||||
|
||||
Feature may be one of the following: COROUTINES, SYSTEMC.
|
||||
Feature may be one of the following: COROUTINES, DEV_ASAN, DEV_GCOV,
|
||||
SYSTEMC.
|
||||
|
||||
.. option:: --getenv <variable>
|
||||
|
||||
@@ -782,6 +822,14 @@ Summary:
|
||||
:option:`/*verilator&32;hier_block*/` metacomment is ignored. See
|
||||
:ref:`Hierarchical Verilation`.
|
||||
|
||||
.. option:: --hierarchical-block <block>
|
||||
|
||||
Internal use only, for :vlopt:`--hierarchical`.
|
||||
|
||||
.. option:: --hierarchical-child <block>
|
||||
|
||||
Internal use only, for :vlopt:`--hierarchical`.
|
||||
|
||||
.. option:: --hierarchical-params-file <filename>
|
||||
|
||||
Rarely needed - internal use. Internal flag inserted used during
|
||||
@@ -839,9 +887,10 @@ Summary:
|
||||
of Verilator if :vlopt:`--verilate-jobs` isn't provided. Also sets
|
||||
:vlopt:`--output-groups` if isn't provided.
|
||||
|
||||
If zero, uses the number of threads in the current hardware. Otherwise,
|
||||
must be a positive integer specifying the maximum number of parallel
|
||||
build jobs.
|
||||
If zero, uses the number of threads available to the process, which is the
|
||||
number of threads assigned by processor affinity (e.g. using `numactl`), or
|
||||
the number of threads in the host hardware if unspecified. Otherwise, must
|
||||
be a positive integer specifying the maximum number of parallel build jobs.
|
||||
|
||||
.. option:: --no-json-edit-nums
|
||||
|
||||
@@ -934,6 +983,10 @@ Summary:
|
||||
"+libext+" is relatively standard across Verilog tools. Defaults to
|
||||
".v+.sv".
|
||||
|
||||
.. option:: +librescan
|
||||
|
||||
Ignored for compatibility with other simulators.
|
||||
|
||||
.. option:: --lint-only
|
||||
|
||||
Check the files for lint violations only, do not create any other
|
||||
@@ -1042,6 +1095,15 @@ Summary:
|
||||
|
||||
Disables optimization of the model.
|
||||
|
||||
.. option:: -O1
|
||||
|
||||
Enables default optimization of the model. This is the default
|
||||
optimization level.
|
||||
|
||||
.. option:: -O2
|
||||
|
||||
Enables stronger than default optimization of the model.
|
||||
|
||||
.. option:: -O3
|
||||
|
||||
Enables slow optimizations for the code Verilator itself generates (as
|
||||
@@ -1205,7 +1267,8 @@ Summary:
|
||||
|
||||
.. option:: --pp-comments
|
||||
|
||||
With :vlopt:`-E`, show comments in preprocessor output.
|
||||
Deprecated. In versions before 5.042, the name for
|
||||
:vlopt:`--preproc-comments`.
|
||||
|
||||
.. option:: --prefix <topname>
|
||||
|
||||
@@ -1213,6 +1276,14 @@ Summary:
|
||||
prepended to the name of the :vlopt:`--top` option, or V prepended to
|
||||
the first Verilog filename passed on the command line.
|
||||
|
||||
.. option:: --preproc-comments
|
||||
|
||||
With :vlopt:`-E`, show comments in preprocessor output.
|
||||
|
||||
.. option:: --preproc-defines
|
||||
|
||||
With :vlopt:`-E`, show defines and undefs in preprocessor output.
|
||||
|
||||
.. option:: --preproc-resolve
|
||||
|
||||
With :vlopt:`-E`, resolve referenced instance modules, to include
|
||||
@@ -1338,13 +1409,12 @@ Summary:
|
||||
.. option:: --public-flat-rw
|
||||
|
||||
Declares all variables, ports, and wires public as if they had
|
||||
:code:`/*verilator public_flat_rw @ (<variable's_source_process_edge>)*/`
|
||||
metacomments. This will make them VPI accessible by their flat name,
|
||||
but not turn off module inlining. This is particularly useful in
|
||||
combination with :vlopt:`--vpi`. This may also in some rare cases result
|
||||
in mis-simulation of generated clocks. Instead of this global option,
|
||||
marking only those signals that need public_flat_rw is typically
|
||||
significantly better performing.
|
||||
:code:`/*verilator public_flat_rw*/` metacomments. This will make them VPI
|
||||
accessible by their flat name, but not turn off module inlining. This is
|
||||
particularly useful in combination with :vlopt:`--vpi`. This may also in
|
||||
some rare cases result in mis-simulation of generated clocks. Instead of
|
||||
this global option, marking only those signals that need public_flat_rw is
|
||||
typically significantly better performing.
|
||||
|
||||
.. option:: --public-ignore
|
||||
|
||||
@@ -1650,14 +1720,15 @@ Summary:
|
||||
.. option:: --trace-max-array <depth>
|
||||
|
||||
Rarely needed. Specify the maximum array depth of a signal that may be
|
||||
traced. Defaults to 32, as tracing large arrays may greatly slow traced
|
||||
simulations.
|
||||
traced. Zero allows any width. Defaults to 32, as tracing large arrays
|
||||
may greatly slow traced simulations.
|
||||
|
||||
.. option:: --trace-max-width <width>
|
||||
|
||||
Rarely needed. Specify the maximum bit width of a signal that may be
|
||||
traced. Defaults to 256, as tracing large vectors may greatly slow
|
||||
traced simulations.
|
||||
Rarely needed. Specify the maximum total bit width of a signal, across
|
||||
all elements if an array, that may be traced. Zero allows any width.
|
||||
Defaults to 4096, as tracing large vectors may greatly slow traced
|
||||
simulations.
|
||||
|
||||
.. option:: --no-trace-params
|
||||
|
||||
@@ -1776,7 +1847,9 @@ Summary:
|
||||
.. option:: --verilate-jobs <value>
|
||||
|
||||
Specify the level of parallelism for the internal compilation steps of
|
||||
Verilator. If zero, uses the number of threads in the current hardware.
|
||||
Verilator. If zero, uses the number of threads available to the process,
|
||||
which is the number of threads assigned by processor affinity (e.g. using
|
||||
`numactl`), or the number of threads in the host hardware if unspecified.
|
||||
Otherwise, must be a positive integer specifying the maximum number of
|
||||
parallel build jobs.
|
||||
|
||||
@@ -1868,7 +1941,7 @@ Summary:
|
||||
.. option:: -Wno-lint
|
||||
|
||||
Disable all lint-related warning messages, and all style warnings. This
|
||||
is equivalent to ``-Wno-ALWCOMBORDER`` ``-Wno-ASCRANGE``
|
||||
is equivalent to ``-Wno-ALWCOMBORDER`` ``-Wno-ASCRANGE`` ``-Wno-ASSIGNEQEXPR``
|
||||
``-Wno-BSSPACE`` ``-Wno-CASEINCOMPLETE`` ``-Wno-CASEOVERLAP``
|
||||
``-Wno-CASEX`` ``-Wno-CASTCONST`` ``-Wno-CASEWITHX`` ``-Wno-CMPCONST``
|
||||
``-Wno-COLONPLUS`` ``-Wno-IMPLICIT`` ``-Wno-IMPLICITSTATIC``
|
||||
@@ -1922,14 +1995,14 @@ Summary:
|
||||
|
||||
Enable all lint-related warning messages (note that by default, they are
|
||||
already enabled), but do not affect style messages. This is equivalent
|
||||
to ``-Wwarn-ALWCOMBORDER`` ``-Wwarn-ASCRANGE`` ``-Wwarn-BSSPACE``
|
||||
``-Wwarn-CASEINCOMPLETE`` ``-Wwarn-CASEOVERLAP`` ``-Wwarn-CASEWITHX``
|
||||
``-Wwarn-CASEX`` ``-Wwarn-CASTCONST`` ``-Wwarn-CMPCONST``
|
||||
``-Wwarn-COLONPLUS`` ``-Wwarn-IMPLICIT`` ``-Wwarn-IMPLICITSTATIC``
|
||||
``-Wwarn-LATCH`` ``-Wwarn-MISINDENT`` ``-Wwarn-NEWERSTD``
|
||||
``-Wwarn-PREPROCZERO`` ``-Wwarn-PINMISSING`` ``-Wwarn-REALCVT``
|
||||
``-Wwarn-STATICVAR`` ``-Wwarn-UNSIGNED`` ``-Wwarn-WIDTHTRUNC``
|
||||
``-Wwarn-WIDTHEXPAND`` ``-Wwarn-WIDTHXZEXPAND``.
|
||||
to ``-Wwarn-ALWCOMBORDER`` ``-Wwarn-ASCRANGE`` ``-Wno-ASSIGNEQEXPR``
|
||||
``-Wwarn-BSSPACE`` ``-Wwarn-CASEINCOMPLETE`` ``-Wwarn-CASEOVERLAP``
|
||||
``-Wwarn-CASEWITHX`` ``-Wwarn-CASEX`` ``-Wwarn-CASTCONST``
|
||||
``-Wwarn-CMPCONST`` ``-Wwarn-COLONPLUS`` ``-Wwarn-IMPLICIT``
|
||||
``-Wwarn-IMPLICITSTATIC`` ``-Wwarn-LATCH`` ``-Wwarn-MISINDENT``
|
||||
``-Wwarn-NEWERSTD`` ``-Wwarn-PREPROCZERO`` ``-Wwarn-PINMISSING``
|
||||
``-Wwarn-REALCVT`` ``-Wwarn-STATICVAR`` ``-Wwarn-UNSIGNED``
|
||||
``-Wwarn-WIDTHTRUNC`` ``-Wwarn-WIDTHEXPAND`` ``-Wwarn-WIDTHXZEXPAND``.
|
||||
|
||||
.. option:: -Wwarn-style
|
||||
|
||||
@@ -1963,14 +2036,13 @@ Summary:
|
||||
different seeds on different executions. This method is the slowest,
|
||||
but safest for finding reset bugs.
|
||||
|
||||
If using `--x-assign unique`, you may want to seed your random number
|
||||
generator such that each regression run gets a different randomization
|
||||
sequence. The simplest is to use the
|
||||
:vlopt:`+verilator+seed+\<value\>` runtime option. Alternatively, use
|
||||
the system's :code:`srand48()` or for Windows :code:`srand()` function
|
||||
to do this. You'll probably also want to print any seeds selected,
|
||||
and code to enable rerunning with that same seed so you can reproduce
|
||||
bugs.
|
||||
If using `--x-assign unique`, use the
|
||||
:vlopt:`+verilator+rand+reset+2 <+verilator+rand+reset+\<value\>>`
|
||||
runtime option, and seed the runtime random number generator such that
|
||||
each regression run gets a different randomization sequence with
|
||||
:vlopt:`+verilator+seed+\<value\>`. You'll probably also want to
|
||||
print any seeds selected, and code to enable rerunning with that same
|
||||
seed, so you can reproduce bugs.
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -1993,6 +2065,14 @@ Summary:
|
||||
use for each initialization. This gives the greatest flexibility and
|
||||
allows for finding reset bugs. See :ref:`Unknown states`.
|
||||
|
||||
If using `--x-initial unique`, use the
|
||||
:vlopt:`+verilator+rand+reset+2 <+verilator+rand+reset+\<value\>>`
|
||||
runtime option, and seed the runtime random number generator such that
|
||||
each regression run gets a different randomization sequence with
|
||||
:vlopt:`+verilator+seed+\<value\>`. You'll probably also want to
|
||||
print any seeds selected, and code to enable rerunning with that same
|
||||
seed, so you can reproduce bugs.
|
||||
|
||||
With "--x-initial fast",
|
||||
is best for performance, and initializes all variables to a state
|
||||
Verilator determines is optimal. This may allow further code
|
||||
@@ -2014,12 +2094,12 @@ Summary:
|
||||
|
||||
.. code-block:: sv
|
||||
|
||||
reg res_n = 1'b0;
|
||||
logic res_n = 1'b0;
|
||||
|
||||
always @(negedge rst_n) begin
|
||||
if (rst_n == 1'b0) begin
|
||||
res_n <= 1'b1;
|
||||
end
|
||||
if (rst_n == 1'b0) begin
|
||||
res_n <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
In Verilator, by default, uninitialized clocks are given a value of
|
||||
@@ -2037,6 +2117,26 @@ Summary:
|
||||
iterations. This may be another indication of problems with the
|
||||
modeled design that should be addressed.
|
||||
|
||||
Instead of using this option, one technique is to explicitly create the
|
||||
appropriate edge by creating a value at construction, and a value in an
|
||||
initial block at time zero:
|
||||
|
||||
.. code-block:: sv
|
||||
|
||||
logic rst_n = 1; // value at construction
|
||||
|
||||
initial begin
|
||||
rst_n = 0; // value at time zero
|
||||
// ... rest
|
||||
end
|
||||
|
||||
always @(negedge rst_n) begin
|
||||
if (rst_n == 1'b0) begin
|
||||
res_n <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
.. option:: --xml-only
|
||||
|
||||
Create XML output only, do not create any other output.
|
||||
@@ -2134,6 +2234,10 @@ The grammar of control commands is as follows:
|
||||
|
||||
.. option:: no_clocker -module "<modulename>" [-task "<taskname>"] -var "<signame>"
|
||||
|
||||
Deprecated and has no effect (ignored).
|
||||
|
||||
In versions before 5.042:
|
||||
|
||||
Indicates whether the signal is used as clock or not. Verilator uses
|
||||
this information to mark the signal and any derived signals as clocker.
|
||||
See :vlopt:`--clk`.
|
||||
@@ -2301,7 +2405,7 @@ The grammar of control commands is as follows:
|
||||
|
||||
.. option:: public_flat_rd [-module "<modulename>"] [-task/-function "<taskname>"] [-var "<signame>"]
|
||||
|
||||
.. option:: public_flat_rw [-module "<modulename>"] [-task/-function "<taskname>"] [-var "<signame>" "@(edge)"]
|
||||
.. option:: public_flat_rw [-module "<modulename>"] [-task/-function "<taskname>"] [-var "<signame>"] ["@(edge)"]
|
||||
|
||||
Sets the variable to be public. Same as
|
||||
:option:`/*verilator&32;public*/` or
|
||||
|
||||
+35
-18
@@ -156,7 +156,7 @@ or "`ifdef`"'s may break other tools.
|
||||
|
||||
.. t_dist_docs_style restart_sort
|
||||
|
||||
.. option:: $c([string], ...);
|
||||
.. option:: $c([string], ...);, $cpure([string], ...);
|
||||
|
||||
The string will be embedded directly in the output C++ code at the point
|
||||
where the surrounding Verilog code is compiled. It may either be a
|
||||
@@ -196,6 +196,11 @@ or "`ifdef`"'s may break other tools.
|
||||
compatibility with other simulators, which require a differently named
|
||||
PLI function name for each different output width.
|
||||
|
||||
`$cpure` is similar to `$c` except that it indicates the
|
||||
expression is pure, versus `$c` which is assumed impure.
|
||||
`$cpure` is for internal use only, and it might change
|
||||
without notice in any future version or Verilator.
|
||||
|
||||
.. option:: $display, $write, $fdisplay, $fwrite, $sformat, $swrite
|
||||
|
||||
Format arguments may use C fprintf sizes after the % escape. Per the
|
||||
@@ -240,7 +245,7 @@ or "`ifdef`"'s may break other tools.
|
||||
reg enable_r /*verilator clock_enable*/;
|
||||
wire gated_clk = clk & enable_r;
|
||||
always_ff @(posedge clk)
|
||||
enable_r <= enable_early;
|
||||
enable_r <= enable_early;
|
||||
|
||||
The clock_enable attribute will cause the clock gate to be ignored in
|
||||
the scheduling algorithm, sometimes required for correct clock behavior,
|
||||
@@ -255,6 +260,10 @@ or "`ifdef`"'s may break other tools.
|
||||
|
||||
.. option:: /*verilator&32;no_clocker*/
|
||||
|
||||
Deprecated and has no effect (ignored).
|
||||
|
||||
In versions before 5.042:
|
||||
|
||||
Specifies whether the signal is used as clock or not. See :vlopt:`--clk`.
|
||||
|
||||
Same as :option:`clocker` and :option:`no_clocker` in configuration
|
||||
@@ -331,8 +340,8 @@ or "`ifdef`"'s may break other tools.
|
||||
// Note the placement of the semicolon above
|
||||
always_comb begin
|
||||
if (....) begin
|
||||
splitme = ....;
|
||||
other assignments
|
||||
splitme = ....;
|
||||
other assignments
|
||||
end
|
||||
end
|
||||
|
||||
@@ -346,27 +355,32 @@ or "`ifdef`"'s may break other tools.
|
||||
// All assignments excluding those to splitme
|
||||
always_comb begin
|
||||
if (....) begin
|
||||
other assignments
|
||||
other assignments
|
||||
end
|
||||
end
|
||||
// All assignments to splitme
|
||||
always_comb begin
|
||||
if (....) begin
|
||||
splitme = ....;
|
||||
splitme = ....;
|
||||
end
|
||||
end
|
||||
|
||||
Same as :option:`isolate_assignments` control file option.
|
||||
|
||||
.. option:: /*verilator&32;lint_off <msg>*/
|
||||
.. option:: /*verilator&32;lint_off <msgs>*/
|
||||
|
||||
Disable the specified warning message for any warnings following the
|
||||
comment.
|
||||
Disable the specified warning message(s) for any warnings following the
|
||||
comment. Multiple messages may be specified, separated with commas.
|
||||
|
||||
.. option:: /*verilator&32;lint_on <msg>*/
|
||||
If a one-line slash-slash-format comment is used, then the metacomment
|
||||
ends at the newline or at an earlier next slash-slash. This allow
|
||||
commenting the reason for the disable, e.g. :code:`// verilator lint_off
|
||||
MSG // Because...`.
|
||||
|
||||
Re-enable the specified warning message for any warnings following the
|
||||
comment.
|
||||
.. option:: /*verilator&32;lint_on <msgs>*/
|
||||
|
||||
Re-enable the specified warning message(s) for any warnings following
|
||||
the comment. Multiple messages may be specified, separated with commas.
|
||||
|
||||
.. option:: /*verilator&32;lint_restore*/
|
||||
|
||||
@@ -505,13 +519,16 @@ or "`ifdef`"'s may break other tools.
|
||||
|
||||
Same as :option:`public_flat_rd` control file option.
|
||||
|
||||
.. option:: /*verilator&32;public_flat_rw @(<edge_list>)*/ (on variable)
|
||||
.. option:: /*verilator&32;public_flat_rw [@(<edge_list>)]*/ (on variable)
|
||||
|
||||
Used after an input, output, register, or wire declaration to indicate
|
||||
the signal should be declared public_flat_rd (see above), and writable,
|
||||
where writes should be considered to have the timing specified by the
|
||||
given sensitivity edge list. Use of this is implied when using the
|
||||
:vlopt:`--public-flat-rw` option.
|
||||
Used after an input, output, register, or wire declaration to indicate the
|
||||
signal should be declared public_flat_rd (see above), and writable. Use of
|
||||
this is implied when using the :vlopt:`--public-flat-rw` option.
|
||||
|
||||
The edge list is optional and has no effect (is ignored). Prior to
|
||||
Verilator 5.024 the edge list specified the timing when writes took
|
||||
place. This is no longer necessary and is accepted only for
|
||||
compatibility.
|
||||
|
||||
Same as :option:`public_flat_rw` control file option.
|
||||
|
||||
|
||||
+4
-10
@@ -42,8 +42,8 @@ For --cc/--sc, it creates:
|
||||
|
||||
.. list-table::
|
||||
|
||||
* - *{prefix}*\ .cmake
|
||||
- CMake include script for compiling (from --make cmake)
|
||||
* - *{prefix}*\ .json
|
||||
- JSON build definition compiling (from --make json)
|
||||
* - *{prefix}*\ .mk
|
||||
- Make include file for compiling (from --make gmake)
|
||||
* - *{prefix}*\ _classes.mk
|
||||
@@ -58,12 +58,8 @@ For --cc/--sc, it creates:
|
||||
- Top-level internal C++ file (from SystemVerilog $root)
|
||||
* - *{prefix}*\ ___024root\ *{__n}*\ .cpp
|
||||
- Additional top-level internal C++ files
|
||||
* - *{prefix}*\ ___024root\ *{__DepSet_hash__n}*\ .cpp
|
||||
- Additional top-level internal C++ files (hashed to reduce build times)
|
||||
* - *{prefix}*\ ___024root__Slow\ *{__n}*\ .cpp
|
||||
- Infrequent cold routines
|
||||
* - *{prefix}*\ ___024root\ *{__DepSet_hash__n}*\ .cpp
|
||||
- Infrequent cold routines (hashed to reduce build times)
|
||||
* - *{prefix}*\ ___024root__Trace\ *{__n}*\ .cpp
|
||||
- Wave file generation code (from --trace-\*)
|
||||
* - *{prefix}*\ ___024root__Trace__Slow\ *{__n}*\ .cpp
|
||||
@@ -86,8 +82,6 @@ For --cc/--sc, it creates:
|
||||
- Lower level internal C++ files
|
||||
* - *{prefix}{each_verilog_module}{__n}*\ .cpp
|
||||
- Additional lower C++ files
|
||||
* - *{prefix}{each_verilog_module}{__DepSet_hash__n}*\ .cpp
|
||||
- Additional lower C++ files (hashed to reduce build times)
|
||||
|
||||
For --hierarchical mode, it creates:
|
||||
|
||||
@@ -99,8 +93,8 @@ For --hierarchical mode, it creates:
|
||||
- Make dependencies of the top module (from --hierarchical)
|
||||
* - *{prefix}*\ _hier.mk
|
||||
- Make file for hierarchical blocks (from --make gmake)
|
||||
* - *{prefix}*\ __hierCMakeArgs.f
|
||||
- Arguments for hierarchical Verilation (from --make cmake)
|
||||
* - *{prefix}*\ __hierMkJsonArgs.f
|
||||
- Arguments for hierarchical Verilation (from --make json)
|
||||
* - *{prefix}*\ __hierMkArgs.f
|
||||
- Arguments for hierarchical Verilation (from --make gmake)
|
||||
* - *{prefix}*\ __hierParameters.v
|
||||
|
||||
+36
-31
@@ -19,7 +19,7 @@ started. (Note distribution packages almost never have the most recent
|
||||
Verilator version, so we recommend following :ref:`Git Install` below,
|
||||
instead.) To install as a package:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
apt-get install verilator # On Ubuntu
|
||||
|
||||
@@ -56,7 +56,7 @@ options and details, see :ref:`Detailed Build Instructions` below.
|
||||
|
||||
In brief, to install from git:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
# Prerequisites:
|
||||
#sudo apt-get install git help2man perl python3 make autoconf g++ flex bison ccache
|
||||
@@ -97,11 +97,10 @@ OS Requirements
|
||||
---------------
|
||||
|
||||
Verilator is developed and has primary testing on Ubuntu, with additional
|
||||
testing on FreeBSD and Apple OS-X. Versions have also been built on Red Hat
|
||||
Linux, other flavors of GNU/Linux-ish platforms, Windows Subsystem for
|
||||
Linux (WSL2), Windows under Cygwin, and Windows under MinGW (gcc
|
||||
-mno-cygwin). Verilated output (not Verilator itself) compiles under all
|
||||
the options above, plus using MSVC++.
|
||||
testing on Apple OS-X, FreeBSD and Windows MSVC. Versions have also been
|
||||
built on Red Hat Linux, other flavors of GNU/Linux-ish platforms, Windows
|
||||
Subsystem for Linux (WSL2), Windows under Cygwin, and Windows under MinGW
|
||||
(gcc -mno-cygwin).
|
||||
|
||||
|
||||
Install Prerequisites
|
||||
@@ -109,7 +108,7 @@ Install Prerequisites
|
||||
|
||||
To build or run Verilator, you need these standard packages:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install git help2man perl python3 make
|
||||
sudo apt-get install g++ # Alternatively, clang
|
||||
@@ -120,27 +119,27 @@ To build or run Verilator, you need these standard packages:
|
||||
|
||||
For SystemC:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install libsystemc libsystemc-dev
|
||||
|
||||
For constraints:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install z3 # Optional solver
|
||||
|
||||
The following is optional but is recommended for nicely rendered command line
|
||||
help when running Verilator:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install perl-doc
|
||||
|
||||
To build or run Verilator, the following are optional but should be installed
|
||||
for good performance:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install ccache # If present at build, needed for run
|
||||
sudo apt-get install mold # If present at build, needed for run
|
||||
@@ -149,19 +148,25 @@ for good performance:
|
||||
To build Verilator you will need to install these packages; these do not
|
||||
need to be present to run Verilator:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install git autoconf flex bison
|
||||
|
||||
Those developing Verilator itself may also want these (see internals.rst):
|
||||
Those developing Verilator itself also need these (see internals.rst):
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install clang clang-format-14 cmake gdb gprof graphviz lcov
|
||||
sudo apt-get install python3-clang python3-distro yapf3 bear jq
|
||||
sudo pip3 install sphinx sphinx_rtd_theme sphinxcontrib-spelling breathe gersemi mbake ruff sarif-tools
|
||||
sudo pip3 install git+https://github.com/antmicro/astsee.git
|
||||
sudo apt-get install clang clang-format-18 cmake gdb gprof graphviz lcov
|
||||
sudo apt-get install python3-clang python3-distro pipx yapf3 bear jq
|
||||
python3 -m venv --system-site-packages ~/.verilator_pyenv
|
||||
source ~/.verilator_pyenv/bin/activate
|
||||
pip3 install sphinx sphinx_rtd_theme sphinxcontrib-spelling breathe gersemi mbake mypy ruff
|
||||
pip3 install git+https://github.com/antmicro/astsee.git
|
||||
pipx install sarif-tools
|
||||
cpan install Pod::Perldoc
|
||||
#
|
||||
# Later, when building or testing Verilator, you will need
|
||||
source ~/.verilator_pyenv/bin/activate
|
||||
|
||||
|
||||
Install SystemC
|
||||
@@ -185,7 +190,7 @@ To make use of Verilator FST tracing you will want `GTKwave
|
||||
<https://gtkwave.sourceforge.net/>`__ installed, however this is not
|
||||
required at Verilator build time.
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install gtkwave # Optional Waveform viewer
|
||||
|
||||
@@ -209,14 +214,14 @@ Obtain Sources
|
||||
Get the sources from the git repository: (You need to do this only once,
|
||||
ever.)
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
git clone https://github.com/verilator/verilator # Only first time
|
||||
## Note the URL above is not a page you can see with a browser; it's for git only
|
||||
|
||||
Enter the checkout and determine what version/branch to use:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
cd verilator
|
||||
git pull # Make sure we're up-to-date
|
||||
@@ -231,7 +236,7 @@ Auto Configure
|
||||
|
||||
Create the configuration script:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
autoconf # Create ./configure script
|
||||
|
||||
@@ -257,7 +262,7 @@ directory (don't run ``make install``). This allows the easiest
|
||||
experimentation and upgrading, and allows many versions of Verilator to
|
||||
co-exist on a system.
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
export VERILATOR_ROOT=`pwd` # if your shell is bash
|
||||
setenv VERILATOR_ROOT `pwd` # if your shell is csh
|
||||
@@ -279,7 +284,7 @@ that may support multiple versions of every tool. Tell configure the
|
||||
eventual destination directory name. We recommend that the destination
|
||||
location include the Verilator version name:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
unset VERILATOR_ROOT # if your shell is bash
|
||||
unsetenv VERILATOR_ROOT # if your shell is csh
|
||||
@@ -291,7 +296,7 @@ the ``bin`` directory to your ``PATH``. Or, if you use `modulecmd
|
||||
<https://modules.sourceforge.net/>`__, you'll want a module file like the
|
||||
following:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
set install_root /CAD_DISK/verilator/{version-number-used-above}
|
||||
unsetenv VERILATOR_ROOT
|
||||
@@ -306,7 +311,7 @@ following:
|
||||
The final option is to eventually install Verilator globally, using
|
||||
configure's default system paths:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
unset VERILATOR_ROOT # if your shell is bash
|
||||
unsetenv VERILATOR_ROOT # if your shell is csh
|
||||
@@ -323,7 +328,7 @@ The command to configure the package was described in the previous step.
|
||||
Developers should configure to have more complete developer tests.
|
||||
Additional packages may be required for these tests.
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
export VERILATOR_AUTHOR_SITE=1 # Put in your .bashrc
|
||||
./configure --enable-longtests ...above options...
|
||||
@@ -334,7 +339,7 @@ Compile
|
||||
|
||||
Compile Verilator:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
make -j `nproc` # Or if error on `nproc`, the number of CPUs in system
|
||||
|
||||
@@ -344,7 +349,7 @@ Test
|
||||
|
||||
Check the compilation by running self-tests:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
make test
|
||||
|
||||
@@ -356,7 +361,7 @@ If you used any install option other than the `1. Run-in-Place from
|
||||
VERILATOR_ROOT <#_1_run_in_place_from_verilator_root>`__ scheme, install
|
||||
the files:
|
||||
|
||||
.. code-block:: shell
|
||||
.. code-block:: bash
|
||||
|
||||
make install
|
||||
|
||||
|
||||
@@ -130,8 +130,9 @@ same time slot.
|
||||
Rising/falling/turn-off delays are currently unsupported and cause the
|
||||
:option:`RISEFALLDLY` warning.
|
||||
|
||||
Minimum/typical/maximum delays are currently unsupported. The typical delay is
|
||||
always the one chosen. Such expressions cause the :option:`MINTYPMAX` warning.
|
||||
Minimum/typical/maximum delays are currently unsupported. The typical delay
|
||||
is always the one chosen. Such expressions cause the :option:`MINTYPMAXDLY`
|
||||
warning.
|
||||
|
||||
Another consequence of using :vlopt:`--timing` is that the :vlopt:`--main`
|
||||
option generates a main file with a proper timing eval loop, eliminating the
|
||||
|
||||
@@ -166,11 +166,6 @@ Unfortunately, using the optimizer with SystemC files can result in
|
||||
compilation taking several minutes. (The SystemC libraries have many little
|
||||
inlined functions that drive the compiler nuts.)
|
||||
|
||||
If using your own makefiles, you may want to compile the Verilated
|
||||
code with ``--MAKEFLAGS -DVL_INLINE_OPT=inline``. This will inline
|
||||
functions; however, this requires that all cpp files be compiled in a single
|
||||
compiler run.
|
||||
|
||||
You may uncover further tuning possibilities by profiling the Verilog code.
|
||||
See :ref:`profiling`.
|
||||
|
||||
|
||||
@@ -18,9 +18,8 @@ Verilator may be used in five major ways:
|
||||
* With the :vlopt:`--lint-only` option, Verilator will lint the design to
|
||||
check for warnings but will not typically create any output files.
|
||||
|
||||
* With the :vlopt:`--xml-only` option, Verilator will create XML output
|
||||
that may be used to feed into other user-designed tools. See
|
||||
:file:`docs/xml.rst` in the distribution.
|
||||
* With the :vlopt:`--json-only` option, Verilator will create JSON output
|
||||
that may be used to feed into other user-designed tools.
|
||||
|
||||
* With the :vlopt:`-E` option, Verilator will preprocess the code according
|
||||
to IEEE preprocessing rules and write the output to standard out. This
|
||||
@@ -60,7 +59,7 @@ When using these options:
|
||||
makefiles to generate an archive (.a) containing the objects.
|
||||
|
||||
#. If :vlopt:`--binary` or :vlopt:`--build` is used, it calls :ref:`GNU
|
||||
Make` or :ref:`CMake` to build the model.
|
||||
Make` to build the model.
|
||||
|
||||
Once a model is built, the next step is typically for the user to run it,
|
||||
see :ref:`Simulating`.
|
||||
@@ -144,10 +143,11 @@ Limitations
|
||||
|
||||
Hierarchy blocks have some limitations, including:
|
||||
|
||||
* The hierarchy block cannot be accessed using dot (.) from the upper
|
||||
module(s) or other hierarchy blocks.
|
||||
|
||||
* Signals in the block cannot be traced.
|
||||
* Internals of the hierarchy block cannot be accessed using dot (.) from
|
||||
the upper module(s) or other hierarchy blocks, except that ports of a
|
||||
hierarchy block instance can be accessed from the directly enclosing
|
||||
nested hierarchy block, or from the top level non-hierarchical portions
|
||||
of the design if not a nested hierarchy block.
|
||||
|
||||
* Modport cannot be used at the hierarchical block boundary.
|
||||
|
||||
|
||||
+276
-68
@@ -103,14 +103,35 @@ List Of Warnings
|
||||
.. code-block:: sv
|
||||
|
||||
always_comb begin
|
||||
a = b;
|
||||
b = 1;
|
||||
a = b;
|
||||
b = 1;
|
||||
end
|
||||
|
||||
Ignoring this warning will only suppress the lint check; it will
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: ALWNEVER
|
||||
|
||||
Warning that an `always @*` statement has no variables being read,
|
||||
therefore the event list is empty, and as there are no events to wake
|
||||
the process up, the always will never execute.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. include:: ../../docs/gen/ex_ALWNEVER_faulty.rst
|
||||
|
||||
Results in:
|
||||
|
||||
.. include:: ../../docs/gen/ex_ALWNEVER_msg.rst
|
||||
|
||||
To repair, assuming the intent was to execute the statements at e.g.
|
||||
time zero, instead use an `always_comb` statement.
|
||||
|
||||
Ignoring this warning will only suppress the lint check; it will
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: ASCRANGE
|
||||
|
||||
.. TODO better example
|
||||
@@ -148,6 +169,29 @@ List Of Warnings
|
||||
This warning is issued only if Verilator is run with :vlopt:`--no-timing`.
|
||||
|
||||
|
||||
.. option:: ASSIGNEQEXPR
|
||||
|
||||
Warning that an assignment with `=` appears in a complex expression.
|
||||
The intent may have been to use `==`, or, if `=` is correct this may be
|
||||
a readability issue.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. include:: ../../docs/gen/ex_ASSIGNEQEXPR_faulty.rst
|
||||
|
||||
Results in:
|
||||
|
||||
.. include:: ../../docs/gen/ex_ASSIGNEQEXPR_msg.rst
|
||||
|
||||
To repair, make the assignment into a separate statement.
|
||||
|
||||
Disabled by default as this is a code-style warning; it will simulate
|
||||
correctly.
|
||||
|
||||
Ignoring this warning will only suppress the lint check; it will
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: ASSIGNIN
|
||||
|
||||
.. TODO better example
|
||||
@@ -254,11 +298,11 @@ List Of Warnings
|
||||
.. code-block:: sv
|
||||
|
||||
always @(posedge clk)
|
||||
if (~reset_l)
|
||||
for (i=0; i<`ARRAY_SIZE; i++)
|
||||
array[i] <= 0; // Non-blocking assignment inside loop
|
||||
else
|
||||
array[address] <= data;
|
||||
if (~reset_l)
|
||||
for (i=0; i<`ARRAY_SIZE; i++)
|
||||
array[i] <= 0; // Non-blocking assignment inside loop
|
||||
else
|
||||
array[address] <= data;
|
||||
|
||||
While this is supported in typical synthesizeable code (including the
|
||||
example above), some complicated cases are not supported. Namely:
|
||||
@@ -458,12 +502,23 @@ List Of Warnings
|
||||
|
||||
Warns that Verilator does not support certain forms of
|
||||
:code:`constraint`, :code:`constraint_mode`, or :code:`rand_mode`, and
|
||||
the construct was are ignored.
|
||||
the construct was ignored.
|
||||
|
||||
Ignoring this warning may make Verilator randomize() simulations differ
|
||||
from other simulators.
|
||||
|
||||
|
||||
.. option:: CONSTWRITTEN
|
||||
|
||||
Error that a :code:`const` data typed variable is being assigned a
|
||||
value.
|
||||
|
||||
IEEE 1800-2023 6.20.6 requires this error.
|
||||
|
||||
Suppressing this error will suppress the error message check; it will
|
||||
simulate as if the :code:`const` as not present.
|
||||
|
||||
|
||||
.. option:: CONTASSREG
|
||||
|
||||
.. TODO better example
|
||||
@@ -486,7 +541,7 @@ List Of Warnings
|
||||
|
||||
Warns that Verilator does not support certain forms of
|
||||
:code:`covergroup`, :code:`coverpoint`, and coverage options, and the
|
||||
construct was are ignored.
|
||||
construct was ignored.
|
||||
|
||||
Disabling the :option:`UNSUPPORTED` error also disables this warning.
|
||||
|
||||
@@ -556,7 +611,7 @@ List Of Warnings
|
||||
:emphasize-lines: 5
|
||||
|
||||
module parameterized
|
||||
#(parameter int MY_PARAM = 0);
|
||||
#(parameter int MY_PARAM = 0);
|
||||
endmodule
|
||||
module upper;
|
||||
defparam p0.MY_PARAM = 1; //<--- Warning
|
||||
@@ -577,12 +632,12 @@ List Of Warnings
|
||||
:emphasize-lines: 6
|
||||
|
||||
module parameterized
|
||||
#(parameter int MY_PARAM = 0);
|
||||
#(parameter int MY_PARAM = 0);
|
||||
endmodule
|
||||
module upper
|
||||
parameterized
|
||||
#(.MY_PARAM(1)) //<--- Repaired
|
||||
p0();
|
||||
#(.MY_PARAM(1)) //<--- Repaired
|
||||
p0();
|
||||
endmodule
|
||||
|
||||
Other tools with similar warnings: Verible's forbid_defparam_rule.
|
||||
@@ -662,7 +717,7 @@ List Of Warnings
|
||||
generated C++ code to add appropriate prints to see what is going on.
|
||||
|
||||
|
||||
.. option:: ENDCAPSULATED
|
||||
.. option:: ENCAPSULATED
|
||||
|
||||
Warns that a class member is declared :code:`local` or
|
||||
:code:`protected`, but is being accessed from outside that class (if
|
||||
@@ -709,6 +764,28 @@ List Of Warnings
|
||||
missing."
|
||||
|
||||
|
||||
.. option:: ENUMITEMWIDTH
|
||||
|
||||
An error that an enum item value is being assigned from a value which
|
||||
would be truncated (similar to :option:`WIDTHTRUNC`), or from a sized
|
||||
literal constant with a different bit width (similar to
|
||||
:option:`WIDTHTRUNC` or :option:`WIDTHEXPAND`). IEEE requires this
|
||||
error, but it may be disabled.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. code-block:: sv
|
||||
:linenos:
|
||||
:emphasize-lines: 2
|
||||
|
||||
typedef enum [3:0] {
|
||||
WRONG_WIDTH = 33'h3 //<--- Warning
|
||||
} enum_t;
|
||||
|
||||
To repair, correct the size of the item's value directly, or use a cast,
|
||||
so the resulting width matches the enum's width.
|
||||
|
||||
|
||||
.. option:: ENUMVALUE
|
||||
|
||||
An error that an enum data type value is being assigned from another data
|
||||
@@ -758,6 +835,25 @@ List Of Warnings
|
||||
with a newline."
|
||||
|
||||
|
||||
.. option:: FUNCTIMECTL
|
||||
|
||||
Error that a function contains a time-controlling statement or call of a
|
||||
task. IEEE 1800-2023 13.4 requires this error.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. include:: ../../docs/gen/ex_FUNCTIMECTL_faulty.rst
|
||||
|
||||
Results in:
|
||||
|
||||
.. include:: ../../docs/gen/ex_FUNCTIMECTL_msg.rst
|
||||
|
||||
Suppressing this error will only suppress the IEEE-required check; in
|
||||
most cases Verilator treats functions and tasks identically and relies
|
||||
on analysis to determine what functions/tasks need to allow time to
|
||||
pass.
|
||||
|
||||
|
||||
.. option:: GENCLK
|
||||
|
||||
Historical, never issued since version 5.000.
|
||||
@@ -788,8 +884,8 @@ List Of Warnings
|
||||
:emphasize-lines: 2
|
||||
|
||||
generate
|
||||
if (PARAM == 1) begin //<--- Warning
|
||||
end
|
||||
if (PARAM == 1) begin //<--- Warning
|
||||
end
|
||||
|
||||
Results in:
|
||||
|
||||
@@ -805,8 +901,8 @@ List Of Warnings
|
||||
:emphasize-lines: 2
|
||||
|
||||
generate
|
||||
if (PARAM == 1) begin : gen_param_1 //<--- Repaired
|
||||
end
|
||||
if (PARAM == 1) begin : gen_param_1 //<--- Repaired
|
||||
end
|
||||
|
||||
Other tools with similar warnings: Verible's generate-label, "All
|
||||
generate block statements must have a label."
|
||||
@@ -819,6 +915,28 @@ List Of Warnings
|
||||
This setting on the top module will be ignored.
|
||||
|
||||
|
||||
.. option:: HIERPARAM
|
||||
|
||||
An error that a hierarchical value or function is being used to assign a parameter.
|
||||
IEEE 1800-2023 6.20.2 requires this error.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. include:: ../../docs/gen/ex_HIERPARAM_faulty.rst
|
||||
|
||||
Results in:
|
||||
|
||||
.. include:: ../../docs/gen/ex_HIERPARAM_msg.rst
|
||||
|
||||
Suppressing this error may allow some hierarchical references to work (especially hierarchical
|
||||
references into interface references), however not all cases are possible, e.g. it cannot
|
||||
reference the parameter of a lower module in a way that affects determining the parameters
|
||||
that elaborate that lower module.
|
||||
|
||||
An exception is made for IEEE 1800-2023 25.10 for interfaces/modports which appear in a module's
|
||||
port list, since these are references to interfaces/modports declared at a higher level and are
|
||||
already specialized. These types of accesses do not require waiving HIERPARAM.
|
||||
|
||||
.. option:: IFDEPTH
|
||||
|
||||
Warns that if/if else statements have exceeded the depth specified with
|
||||
@@ -842,7 +960,7 @@ List Of Warnings
|
||||
:emphasize-lines: 5
|
||||
|
||||
function int function_being_called_as_task;
|
||||
return 1;
|
||||
return 1;
|
||||
endfunction
|
||||
|
||||
initial function_being_called_as_task(); //<--- Warning
|
||||
@@ -861,7 +979,7 @@ List Of Warnings
|
||||
:emphasize-lines: 5
|
||||
|
||||
function int function_being_called_as_task;
|
||||
return 1;
|
||||
return 1;
|
||||
endfunction
|
||||
|
||||
initial void'(function_being_called_as_task()); //<--- Repaired
|
||||
@@ -1031,10 +1149,10 @@ List Of Warnings
|
||||
:emphasize-lines: 3
|
||||
|
||||
task foo(int local_var);
|
||||
fork
|
||||
#10 local_var++;
|
||||
#20 $display("local_var = %d", local_var);
|
||||
join_none
|
||||
fork
|
||||
#10 local_var++;
|
||||
#20 $display("local_var = %d", local_var);
|
||||
join_none
|
||||
endtask
|
||||
|
||||
In the example above 'local_var' exists only within scope of 'foo', once foo
|
||||
@@ -1056,19 +1174,19 @@ List Of Warnings
|
||||
:emphasize-lines: 4
|
||||
|
||||
task foo(int local_var);
|
||||
fork
|
||||
#10 begin
|
||||
int forked_var = local_var;
|
||||
forked_var++;
|
||||
end
|
||||
#20 begin
|
||||
// Note that we are going to print the original value here,
|
||||
// as `forked_var`is a local copy that was initialized while
|
||||
// `foo` was still alive.
|
||||
int forked_var = local_var;
|
||||
$display("forked_var = %d", forked_var)
|
||||
end
|
||||
join_none
|
||||
fork
|
||||
#10 begin
|
||||
int forked_var = local_var;
|
||||
forked_var++;
|
||||
end
|
||||
#20 begin
|
||||
// Note that we are going to print the original value here,
|
||||
// as `forked_var`is a local copy that was initialized while
|
||||
// `foo` was still alive.
|
||||
int forked_var = local_var;
|
||||
$display("forked_var = %d", forked_var)
|
||||
end
|
||||
join_none
|
||||
endtask
|
||||
|
||||
If you need to share its state, another strategy is to ensure it's allocated
|
||||
@@ -1081,10 +1199,10 @@ List Of Warnings
|
||||
int static_var;
|
||||
|
||||
task foo();
|
||||
fork
|
||||
#10 static_var++;
|
||||
#20 $display("static_var = %d", static_var);
|
||||
join_none
|
||||
fork
|
||||
#10 static_var++;
|
||||
#20 $display("static_var = %d", static_var);
|
||||
join_none
|
||||
endtask
|
||||
|
||||
However, if you need to be able to instantiate at runtime, the solution would be to
|
||||
@@ -1096,23 +1214,23 @@ List Of Warnings
|
||||
:emphasize-lines: 2
|
||||
|
||||
class Wrapper;
|
||||
int m_var;
|
||||
int m_var;
|
||||
|
||||
// Here we implicitly hold a reference to `this`
|
||||
task foo();
|
||||
fork
|
||||
#10 m_var++;
|
||||
#20 $display("this.m_var = %d", m_var);
|
||||
join_none
|
||||
endtask
|
||||
// Here we implicitly hold a reference to `this`
|
||||
task foo();
|
||||
fork
|
||||
#10 m_var++;
|
||||
#20 $display("this.m_var = %d", m_var);
|
||||
join_none
|
||||
endtask
|
||||
endclass
|
||||
|
||||
// Here we explicitly hold a handle to an object
|
||||
task bar(Wrapper wrapper);
|
||||
fork
|
||||
#10 wrapper.m_var++;
|
||||
#20 $display("wrapper.m_var = %d", wrapper.m_var);
|
||||
join_none
|
||||
fork
|
||||
#10 wrapper.m_var++;
|
||||
#20 $display("wrapper.m_var = %d", wrapper.m_var);
|
||||
join_none
|
||||
endtask
|
||||
|
||||
.. option:: LITENDIAN
|
||||
@@ -1123,7 +1241,7 @@ List Of Warnings
|
||||
backwards compatibility, new projects should use :option:`ASCRANGE`.
|
||||
|
||||
|
||||
.. option:: MINTYPMAX
|
||||
.. option:: MINTYPMAXDLY
|
||||
|
||||
.. code-block:: sv
|
||||
|
||||
@@ -1154,8 +1272,8 @@ List Of Warnings
|
||||
:emphasize-lines: 3
|
||||
|
||||
if (something)
|
||||
statement_in_if;
|
||||
statement_not_in_if; //<--- Warning
|
||||
statement_in_if;
|
||||
statement_not_in_if; //<--- Warning
|
||||
|
||||
Results in:
|
||||
|
||||
@@ -1171,7 +1289,7 @@ List Of Warnings
|
||||
:emphasize-lines: 3
|
||||
|
||||
if (something)
|
||||
statement_in_if;
|
||||
statement_in_if;
|
||||
statement_not_in_if; //<--- Repaired
|
||||
|
||||
Other tools with similar warnings: GCC -Wmisleading-indentation,
|
||||
@@ -1286,6 +1404,21 @@ List Of Warnings
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: NOEFFECT
|
||||
|
||||
Warns that the statement will have no effect and is roughly equivalent
|
||||
to not being present. This is only issued when it is "non-obvious",
|
||||
e.g. a :code:`if (0)` will not result in this warning.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. code-block:: sv
|
||||
|
||||
foreach (array[]) begin ... end //<--- Warning
|
||||
|
||||
For a fix, remove the statement.
|
||||
|
||||
|
||||
.. option:: NOLATCH
|
||||
|
||||
.. TODO better example
|
||||
@@ -1309,6 +1442,27 @@ List Of Warnings
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: NORETURN
|
||||
|
||||
Warns that a non-void function has no return statement, nor sets the
|
||||
output result of the function.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. include:: ../../docs/gen/ex_NORETURN_faulty.rst
|
||||
|
||||
Results in:
|
||||
|
||||
.. include:: ../../docs/gen/ex_NORETURN_msg.rst
|
||||
|
||||
To fix the issue, add a :code:`return` statement, or set the output
|
||||
variable of the function, or make the function of data type
|
||||
:code:`void`.
|
||||
|
||||
Ignoring this warning will only suppress the lint check; it will
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: NOTIMING
|
||||
|
||||
Error when a timing-related construct that requires :vlopt:`--timing` has
|
||||
@@ -1341,6 +1495,27 @@ List Of Warnings
|
||||
simulate correctly.
|
||||
|
||||
|
||||
.. option:: PARAMNODEFAULT
|
||||
|
||||
An error that a parameter is being declared that has no default value,
|
||||
and this is being done in a non-ANSI block while this is only legal in
|
||||
ANSI-style `#(...)` declarations. IEEE 1800-2023 6.20.1 requires this
|
||||
error, but some simulators accept this syntax.
|
||||
|
||||
Faulty example:
|
||||
|
||||
.. include:: ../../docs/gen/ex_PARAMNODEFAULT_faulty.rst
|
||||
|
||||
Results in:
|
||||
|
||||
.. include:: ../../docs/gen/ex_PARAMNODEFAULT_msg.rst
|
||||
|
||||
To fix the issue, move to an ANSI-style declaration.
|
||||
|
||||
Suppressing this error will only suppress the IEEE-required check; it
|
||||
will simulate correctly.
|
||||
|
||||
|
||||
.. option:: PINCONNECTEMPTY
|
||||
|
||||
.. TODO better example
|
||||
@@ -1410,11 +1585,11 @@ List Of Warnings
|
||||
module a;
|
||||
localparam A=1;
|
||||
generate
|
||||
if (A==0) begin
|
||||
b b_inst1 (.x(1'b0)); //<--- error nonexistent port
|
||||
b #(.PX(1'b0)) b_inst2 (); //<--- error nonexistent parameter
|
||||
end
|
||||
endgenerate
|
||||
if (A==0) begin
|
||||
b b_inst1 (.x(1'b0)); //<--- error nonexistent port
|
||||
b #(.PX(1'b0)) b_inst2 (); //<--- error nonexistent parameter
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
||||
|
||||
module b;
|
||||
@@ -1554,6 +1729,19 @@ List Of Warnings
|
||||
accepts the protected code.
|
||||
|
||||
|
||||
.. option:: PROTOTYPEMIS
|
||||
|
||||
Error that a function prototype does not match in some respects the
|
||||
out-of-block declaration of that function. IEEE requires this error.
|
||||
|
||||
The typical solution is to fix the prototype to match the declaration
|
||||
exactly, including in number of arguments, name of arguments, argument
|
||||
data types, and return data type (for functions).
|
||||
|
||||
Disabling this error will cause Verilator to ignore the prototype and
|
||||
may make the code illegal in other tools.
|
||||
|
||||
|
||||
.. option:: RANDC
|
||||
|
||||
Historical, never issued since version 5.018, when :code:`randc` became
|
||||
@@ -1674,9 +1862,9 @@ List Of Warnings
|
||||
|
||||
wire vec[6:0];
|
||||
initial begin
|
||||
index = 7;
|
||||
...
|
||||
if (index < 7) out = vec[index]; // Never will use vec[7]
|
||||
index = 7;
|
||||
...
|
||||
if (index < 7) out = vec[index]; // Never will use vec[7]
|
||||
|
||||
Other tools with similar warnings: Icarus Verilog's select-range,
|
||||
"warning: ... [...] is selecting before vector" or "is selecting before
|
||||
@@ -1742,6 +1930,18 @@ List Of Warnings
|
||||
simulators.
|
||||
|
||||
|
||||
.. option:: SPECIFYIGN
|
||||
|
||||
Warns that Verilator does not support certain constructs in
|
||||
:code:`specify` blocks, nor :code:`$sdf_annotate`, and the construct was
|
||||
ignored.
|
||||
|
||||
Disabling the :option:`UNSUPPORTED` error also disables this warning.
|
||||
|
||||
Ignoring this warning may make Verilator ignore lint checking on the
|
||||
construct, and get different results from other simulators.
|
||||
|
||||
|
||||
.. option:: SPLITVAR
|
||||
|
||||
Warns that a variable with a :option:`/*verilator&32;split_var*/`
|
||||
@@ -1848,7 +2048,7 @@ List Of Warnings
|
||||
task foo(inout sig); ... endtask
|
||||
// ...
|
||||
always @* begin
|
||||
foo(bus_we_select_from[2]); // Will get TASKNSVAR error
|
||||
foo(bus_we_select_from[2]); // Will get TASKNSVAR error
|
||||
end
|
||||
|
||||
Change this to:
|
||||
@@ -1859,8 +2059,8 @@ List Of Warnings
|
||||
// ...
|
||||
reg foo_temp_out;
|
||||
always @* begin
|
||||
foo(foo_temp_out);
|
||||
bus_we_select_from[2] = foo_temp_out;
|
||||
foo(foo_temp_out);
|
||||
bus_we_select_from[2] = foo_temp_out;
|
||||
end
|
||||
|
||||
Verilator doesn't do this conversion for you, as some more complicated
|
||||
@@ -2105,6 +2305,14 @@ List Of Warnings
|
||||
:option:`UNUSEDSIGNAL`.
|
||||
|
||||
|
||||
.. option:: UNUSEDLOOP
|
||||
|
||||
.. TODO better example
|
||||
|
||||
Warns that a loop condition is always false, and so the body of the loop
|
||||
will never be executed.
|
||||
|
||||
|
||||
.. option:: UNUSEDPARAM
|
||||
|
||||
.. TODO better example
|
||||
|
||||
+119
-16
@@ -450,7 +450,7 @@ as defined in the standard:
|
||||
- All other logic is assigned to the 'nba' region.
|
||||
|
||||
For completeness, note that a subset of the 'act' region logic, specifically,
|
||||
the logic related to the pre-assignments of NBA updates (i.e., AstAssignPre
|
||||
the logic related to the pre-assignments of NBA updates (i.e., AstAlwaysPre
|
||||
nodes), is handled separately, but is executed as part of the 'act' region.
|
||||
|
||||
Also note that all logic representing the committing of an NBA (i.e., Ast*Post)
|
||||
@@ -1131,7 +1131,7 @@ Indentation and Naming Style
|
||||
----------------------------
|
||||
|
||||
We will work with contributors to fix up indentation style issues, but it
|
||||
is appreciated if you could match our style:
|
||||
is appreciated if you could match our style for C/C++:
|
||||
|
||||
- Use "mixedCapsSymbols" instead of "underlined_symbols".
|
||||
|
||||
@@ -1143,9 +1143,8 @@ is appreciated if you could match our style:
|
||||
calls. (This convention has not been applied retroactively.)
|
||||
|
||||
C and Python indentation is automatically maintained with "make format"
|
||||
using clang-format version 10.0.0, and yapf for python, and is
|
||||
automatically corrected in the CI actions. For those manually formatting C
|
||||
code:
|
||||
using clang-format version 18, and yapf for Python, and is automatically
|
||||
corrected in the CI actions. For those manually formatting C code:
|
||||
|
||||
- Use four spaces per level, and no tabs.
|
||||
|
||||
@@ -1157,6 +1156,58 @@ code:
|
||||
- No spaces before semicolons, nor between a function's name and open
|
||||
parenthesis (only applies to functions; if/else has a following space).
|
||||
|
||||
Verilog indentation is not yet automatically maintained, but:
|
||||
|
||||
- Use two spaces per level, and no tabs.
|
||||
|
||||
- Place `begin` on the same line as the earlier starting statement
|
||||
e.g. `if`, and place the `end` on a separate line indented the same as
|
||||
the starting statement.
|
||||
|
||||
|
||||
Commit messages
|
||||
---------------
|
||||
|
||||
Pull requests do not typically edit ``Changes`` in order to reduce
|
||||
potential merge conflicts. Instead, contributors should use an appropriate
|
||||
first line of the git commit message. Maintainers periodically run
|
||||
``nodist/log_changes`` which analyzes the commit messages to suggest edits
|
||||
to the ``Changes`` file.
|
||||
|
||||
The format of a commit message should be typically of the forms below. The
|
||||
github issue number, and github pull number if different should be
|
||||
included.
|
||||
|
||||
"Add <some feature> (#1234)"
|
||||
For adding a new feature.
|
||||
"Fix <some item> (#1234)"
|
||||
For a bug fix.
|
||||
"Improve <some item> (#1234)"
|
||||
For improving something that previously existed.
|
||||
"Optimize <some item> (#1234)"
|
||||
For improving performance.
|
||||
"Support <some feature> (#1234)"
|
||||
For features that are described by IEEE were previously not supported.
|
||||
"Commentary"
|
||||
For a super-trivial change to e.g. documentation.
|
||||
These will typically not get described in the Changes file.
|
||||
"CI: <Add/Improve/etc as above> (#1234)"
|
||||
For changes that only concern github actions.
|
||||
These will typically not get described in the Changes file.
|
||||
"Tests: <Add/Improve/etc as above> (#1234)"
|
||||
For changes that only concern tests.
|
||||
These will typically not get described in the Changes file.
|
||||
"Internals: <Add/Improve/etc as above> (#1234)"
|
||||
For changes that only concern developers, e.g. code cleanups.
|
||||
These will typically not get described in the Changes file.
|
||||
|
||||
The line's grammar should match the phrasing used in the Changes file.
|
||||
|
||||
If the change does not affect user-visible function, also add "No
|
||||
functional change." if it's 99% certain not to change behavior, or "No
|
||||
functional change expected." if no change was expected but there may be
|
||||
uncertainty.
|
||||
|
||||
|
||||
The ``astgen`` Script
|
||||
---------------------
|
||||
@@ -1164,7 +1215,7 @@ The ``astgen`` Script
|
||||
The ``astgen`` script is used to generate some of the repetitive C++ code
|
||||
related to the ``AstNode`` type hierarchy. An example is the abstract ``visit``
|
||||
methods in ``VNVisitor``. There are other uses; please see the ``*__gen*``
|
||||
files in the bulid directories and the ``astgen`` script for details. A
|
||||
files in the build directories and the ``astgen`` script for details. A
|
||||
description of the more advanced features of ``astgen`` are provided here.
|
||||
|
||||
|
||||
@@ -1573,7 +1624,7 @@ Benchmarking
|
||||
------------
|
||||
|
||||
For benchmarking the effects of changes (simulation speed, memory consumption,
|
||||
verilation time, etc.), you can use `RTLMeter
|
||||
Verilation time, etc.), you can use `RTLMeter
|
||||
<https://github.com/verilator/rtlmeter>`__, a benchmark suite designed for this
|
||||
purpose. The scripts provided with RTLMeter have many capabilities. For full
|
||||
details, see the `documentation of RTLMeter
|
||||
@@ -1605,6 +1656,54 @@ significant variance. Experience shows that a ~20% time difference can be
|
||||
reliably measured on GitHub hosted runners, and smaller differences are
|
||||
noticeable over a few days of reruns as trends emerge from the noise.
|
||||
|
||||
Code coverage
|
||||
-------------
|
||||
|
||||
Code coverage for developing Verilator itself can be collected using ``gcc``
|
||||
and ``gcov`` with the following flow. Note that configuring with
|
||||
``--enable-dev-gcov`` disables optimization for both the debug and optimized
|
||||
builds of Verilator, so running the resulting executables can be slow:
|
||||
|
||||
.. code:: shell
|
||||
|
||||
./configure --enable-longtests --enable-dev-gcov
|
||||
make -j$(nproc) # Build verilator
|
||||
make test # Run the tests - this will generate .gcda files
|
||||
make coverage-view # Create and open HTML coverate reprot
|
||||
|
||||
|
||||
The ``coverage-view`` make target opens the generated coverage report. This
|
||||
depends on ``coverage-report``, which generates the HTML coverage report. That
|
||||
turn depends on ``coverage-combine``, which combines all ``.gcda`` files into
|
||||
an lcov data file. Each of these make targets can be used separately if
|
||||
desired.
|
||||
|
||||
You can also use the ``coverage-zero`` target to remove all ``.gcda`` files,
|
||||
which in effect clears all collected coverage data. This can be useful when
|
||||
checking individual test cases while modifying them.
|
||||
|
||||
To collect coverage only for select tests, instead of ``make test``, run the
|
||||
individual ``test_regress/t/*.py`` cases, then use ``make coverage-view`` as
|
||||
before.
|
||||
|
||||
Note that every time binary built with coverage collection is invoked, it will
|
||||
add the coverage data collected during that invocation to the existing
|
||||
``.gcda`` files. This means that ``verilator`` can also be run on any other
|
||||
external files or projects to collect code coverage on those invocations.
|
||||
|
||||
Be aware if changing a test, if that test no longer covers some item, the
|
||||
report will still contain the old coverage. Use ``make coverage-zero`` and
|
||||
rerun all tests if this is a concern.
|
||||
|
||||
It is also possible to generate a 'patch coverage' report, which will only
|
||||
contain information about lines modified compared to a Git ref specified by the
|
||||
``COVERAGE_BASE`` Make variable (including uncommitted changes). For example,
|
||||
to see coverage of changes compared to upstream, use:
|
||||
|
||||
.. code:: shell
|
||||
|
||||
make coverage-view COVERAGE_BASE=origin/master
|
||||
|
||||
Fuzzing
|
||||
-------
|
||||
|
||||
@@ -1995,10 +2094,8 @@ Generally, what would you do to add a new feature?
|
||||
|
||||
2. Make a testcase in the test_regress/t/t_EXAMPLE format, see `Testing`.
|
||||
|
||||
3. If grammar changes are needed, look at the git version of VerilogPerl's
|
||||
src/VParseGrammar.y, as this grammar supports the full SystemVerilog
|
||||
language and has a lot of back-and-forth with Verilator's grammar. Copy
|
||||
the appropriate rules to src/verilog.y and modify the productions.
|
||||
3. If grammar changes are needed, look at the IEEE 1800-2023 Appendix A, as
|
||||
src/verilog.y generally follows the same rule layout.
|
||||
|
||||
4. If a new Ast type is needed, add it to the appropriate V3AstNode*.h.
|
||||
Follow the convention described above about the AstNode type hierarchy.
|
||||
@@ -2065,6 +2162,14 @@ the regression tests with OBJCACHE enabled and in parallel on a machine
|
||||
with many cores. See the -j option and OBJCACHE environment variable.
|
||||
|
||||
|
||||
driver.py Pass-Thru Arguments
|
||||
-----------------------------
|
||||
|
||||
Arguments not understood by `driver.py` which begin with `+verilator+` are
|
||||
passed through as Verilated executable arguments. Other not-understood
|
||||
arguments are passed as Verilator arguments.
|
||||
|
||||
|
||||
driver.py Non-Scenario Arguments
|
||||
--------------------------------
|
||||
|
||||
@@ -2137,17 +2242,15 @@ driver.py Non-Scenario Arguments
|
||||
--rrsim
|
||||
Run Verilator generated executable and record with ``rr``.
|
||||
|
||||
--sanitize
|
||||
Enable address sanitizer to compile Verilated C++ code. This may detect
|
||||
misuses of memory, such as out-of-bound accesses, use-after-free, and
|
||||
memory leaks.
|
||||
|
||||
--site
|
||||
Run site-specific tests also.
|
||||
|
||||
--stop
|
||||
Stop on the first error.
|
||||
|
||||
--top-filename <file>
|
||||
Override the default Verilog file name.
|
||||
|
||||
--trace
|
||||
Set the simulator-specific flags to request waveform tracing.
|
||||
|
||||
|
||||
+26
-1
@@ -218,6 +218,7 @@ Katzman
|
||||
Kelin
|
||||
Keren
|
||||
Keyi
|
||||
Keßler
|
||||
Kimmitt
|
||||
Kindgren
|
||||
Kirkham
|
||||
@@ -314,6 +315,7 @@ Noack
|
||||
Nodine
|
||||
Ober
|
||||
Oleg
|
||||
Oler
|
||||
Olof
|
||||
Olofsson
|
||||
Oron
|
||||
@@ -360,6 +362,7 @@ Rolfe
|
||||
Rontionov
|
||||
Roodselaar
|
||||
Roshit
|
||||
Rufer
|
||||
Runtime
|
||||
Ruud
|
||||
Rystsov
|
||||
@@ -427,6 +430,7 @@ Terpstra
|
||||
Thiede
|
||||
Thierry
|
||||
Thyer
|
||||
Tianchen
|
||||
Tianrui
|
||||
Tichelaar
|
||||
Timi
|
||||
@@ -470,6 +474,7 @@ Verilog
|
||||
Vighnesh
|
||||
Viktor
|
||||
Vilp
|
||||
VlWide
|
||||
Vlip
|
||||
Vm
|
||||
Vukobratovic
|
||||
@@ -481,6 +486,7 @@ Wfuture
|
||||
Whatson
|
||||
Wildman
|
||||
Wim
|
||||
Wipfli
|
||||
Wmisleading
|
||||
Wno
|
||||
Wojciech
|
||||
@@ -511,6 +517,7 @@ Zhang
|
||||
abirkmanis
|
||||
accessor
|
||||
accessors
|
||||
acyclic
|
||||
adrienlemasle
|
||||
agrobman
|
||||
ahouska
|
||||
@@ -523,6 +530,8 @@ ar
|
||||
architected
|
||||
args
|
||||
arrarys
|
||||
asan
|
||||
aslr
|
||||
assertOn
|
||||
assertcontrol
|
||||
astgen
|
||||
@@ -585,7 +594,9 @@ combinational
|
||||
combinatorial
|
||||
commandArgsPlusMatch
|
||||
compilable
|
||||
computable
|
||||
concat
|
||||
concatenatable
|
||||
concats
|
||||
conf
|
||||
config
|
||||
@@ -600,9 +611,11 @@ coroutines
|
||||
countbits
|
||||
countones
|
||||
cout
|
||||
covergroup
|
||||
cpp
|
||||
cppstyle
|
||||
cpu
|
||||
cpure
|
||||
ctor
|
||||
ctrace
|
||||
cutable
|
||||
@@ -624,9 +637,11 @@ defparam
|
||||
demangling
|
||||
dep
|
||||
deparametrized
|
||||
deque
|
||||
der
|
||||
dereference
|
||||
dereferenced
|
||||
dereferencing
|
||||
desassign
|
||||
deserialize
|
||||
destructor
|
||||
@@ -635,7 +650,9 @@ detections
|
||||
dev
|
||||
devcontainer
|
||||
devel
|
||||
difftree
|
||||
dir
|
||||
disambiguates
|
||||
displayb
|
||||
distcc
|
||||
doxygen
|
||||
@@ -664,6 +681,7 @@ elab
|
||||
eliasphanna
|
||||
elike
|
||||
elsif
|
||||
enablement
|
||||
endcase
|
||||
endcelldefine
|
||||
endclass
|
||||
@@ -734,7 +752,9 @@ fwrite
|
||||
gantt
|
||||
gcc
|
||||
gcda
|
||||
gcov
|
||||
gdb
|
||||
gdbinit
|
||||
genblk
|
||||
genvar
|
||||
genvars
|
||||
@@ -752,8 +772,8 @@ hdr
|
||||
hdzhangdoc
|
||||
hh
|
||||
hier
|
||||
hierCMakeArgs
|
||||
hierMkArgs
|
||||
hierMkJsonArgs
|
||||
hierParameters
|
||||
hierVer
|
||||
html
|
||||
@@ -833,6 +853,7 @@ miree
|
||||
mis
|
||||
misconnected
|
||||
misconversion
|
||||
misdetecting
|
||||
misoptimized
|
||||
missized
|
||||
mk
|
||||
@@ -969,6 +990,8 @@ realtime
|
||||
realtobits
|
||||
recoding
|
||||
recrem
|
||||
recurse
|
||||
recurses
|
||||
redeclaring
|
||||
regs
|
||||
reloop
|
||||
@@ -1085,6 +1108,7 @@ unbased
|
||||
uncomment
|
||||
undef
|
||||
undefineall
|
||||
undefs
|
||||
undriven
|
||||
ungetc
|
||||
unhandled
|
||||
@@ -1100,6 +1124,7 @@ unroller
|
||||
unsized
|
||||
unsup
|
||||
untyped
|
||||
upcasting
|
||||
urandom
|
||||
uselib
|
||||
utimes
|
||||
|
||||
+80
-38
@@ -72,7 +72,7 @@
|
||||
# include <execinfo.h>
|
||||
# define _VL_HAVE_STACKTRACE
|
||||
#endif
|
||||
#if defined(__linux) || (defined(__APPLE__) && defined(__MACH__))
|
||||
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
||||
# include <sys/time.h>
|
||||
# include <sys/resource.h>
|
||||
# define _VL_HAVE_GETRLIMIT
|
||||
@@ -168,7 +168,12 @@ void vl_fatal(const char* filename, int linenum, const char* hier, const char* m
|
||||
|
||||
// Callbacks prior to termination
|
||||
Verilated::runExitCallbacks();
|
||||
std::abort();
|
||||
|
||||
if (Verilated::debug()) {
|
||||
std::abort();
|
||||
} else {
|
||||
std::exit(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -251,8 +256,8 @@ std::string _vl_string_vprintf(const char* formatp, va_list ap) VL_MT_SAFE {
|
||||
}
|
||||
|
||||
uint64_t _vl_dbg_sequence_number() VL_MT_SAFE {
|
||||
static std::atomic<uint64_t> sequence;
|
||||
return ++sequence;
|
||||
static std::atomic<uint64_t> s_sequence;
|
||||
return ++s_sequence;
|
||||
}
|
||||
|
||||
uint32_t VL_THREAD_ID() VL_MT_SAFE {
|
||||
@@ -289,6 +294,16 @@ void VL_PRINTF_MT(const char* formatp, ...) VL_MT_SAFE {
|
||||
}});
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
// Process -- parts of std::process implementation
|
||||
|
||||
std::string VlProcess::randstate() const VL_MT_UNSAFE {
|
||||
return VlRNG::vl_thread_rng().get_randstate();
|
||||
}
|
||||
void VlProcess::randstate(const std::string& state) VL_MT_UNSAFE {
|
||||
VlRNG::vl_thread_rng().set_randstate(state);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
// Random -- Mostly called at init time, so not inline.
|
||||
|
||||
@@ -622,11 +637,9 @@ WDataOutP VL_POW_WWW(int obits, int, int rbits, WDataOutP owp, const WDataInP lw
|
||||
VL_DEBUG_IFDEF(assert(owords <= VL_MULS_MAX_WORDS););
|
||||
owp[0] = 1;
|
||||
for (int i = 1; i < VL_WORDS_I(obits); ++i) owp[i] = 0;
|
||||
// cppcheck-has-bug-suppress variableScope
|
||||
VlWide<VL_MULS_MAX_WORDS> powstore; // Fixed size, as MSVC++ doesn't allow [words] here
|
||||
VlWide<VL_MULS_MAX_WORDS> lastpowstore; // Fixed size, as MSVC++ doesn't allow [words] here
|
||||
VlWide<VL_MULS_MAX_WORDS> lastoutstore; // Fixed size, as MSVC++ doesn't allow [words] here
|
||||
// cppcheck-has-bug-suppress variableScope
|
||||
VL_ASSIGN_W(obits, powstore, lwp);
|
||||
for (int bit = 0; bit < rbits; ++bit) {
|
||||
if (bit > 0) { // power = power*power
|
||||
@@ -1319,6 +1332,19 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
|
||||
_vl_vsss_advance(fp, floc);
|
||||
break;
|
||||
}
|
||||
case '0': // FALLTHRU
|
||||
case '1': // FALLTHRU
|
||||
case '2': // FALLTHRU
|
||||
case '3': // FALLTHRU
|
||||
case '4': // FALLTHRU
|
||||
case '5': // FALLTHRU
|
||||
case '6': // FALLTHRU
|
||||
case '7': // FALLTHRU
|
||||
case '8': // FALLTHRU
|
||||
case '9': {
|
||||
inPct = true;
|
||||
break;
|
||||
}
|
||||
case '*':
|
||||
inPct = true;
|
||||
inIgnore = true;
|
||||
@@ -1326,7 +1352,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
|
||||
default: {
|
||||
// Deal with all read-and-scan somethings
|
||||
// Note LSBs are preserved if there's an overflow
|
||||
const int obits = inIgnore ? 0 : va_arg(ap, int);
|
||||
int obits = inIgnore ? 0 : va_arg(ap, int);
|
||||
VlWide<VL_WQ_WORDS_E> qowp;
|
||||
VL_SET_WQ(qowp, 0ULL);
|
||||
WDataOutP owp = qowp;
|
||||
@@ -1379,7 +1405,6 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
|
||||
_vl_vsss_skipspace(fp, floc, fromp, fstr);
|
||||
_vl_vsss_read_str(fp, floc, fromp, fstr, t_tmp, "+-.0123456789eE");
|
||||
if (!t_tmp[0]) goto done;
|
||||
// cppcheck-has-bug-suppress unusedStructMember, unreadVariable
|
||||
union {
|
||||
double r;
|
||||
int64_t ld;
|
||||
@@ -1388,7 +1413,26 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
|
||||
VL_SET_WQ(owp, u.ld);
|
||||
break;
|
||||
}
|
||||
case 't': // FALLTHRU // Time
|
||||
case 't': { // Time
|
||||
_vl_vsss_skipspace(fp, floc, fromp, fstr);
|
||||
_vl_vsss_read_str(fp, floc, fromp, fstr, t_tmp, "+-.0123456789eE");
|
||||
if (!t_tmp[0]) goto done;
|
||||
union {
|
||||
double r;
|
||||
int64_t ld;
|
||||
} u;
|
||||
// Get pointer argument first, as proceeds the timeunit value
|
||||
if (obits != 64) goto done;
|
||||
QData* const realp = va_arg(ap, QData*);
|
||||
const int timeunit = va_arg(ap, int);
|
||||
const int userUnits
|
||||
= Verilated::threadContextp()->impp()->timeFormatUnits(); // 0..-15
|
||||
const int shift = -userUnits + timeunit; // 0..-15
|
||||
u.r = std::strtod(t_tmp, nullptr) * vl_time_multiplier(-shift);
|
||||
*realp = VL_CLEAN_QQ(obits, obits, u.ld);
|
||||
obits = 0; // Already loaded the value, don't read arg
|
||||
break;
|
||||
}
|
||||
case '#': { // Unsigned decimal
|
||||
_vl_vsss_skipspace(fp, floc, fromp, fstr);
|
||||
_vl_vsss_read_str(fp, floc, fromp, fstr, t_tmp, "0123456789+-xXzZ?_");
|
||||
@@ -1753,7 +1797,7 @@ uint64_t VL_MURMUR64_HASH(const char* key) VL_PURE {
|
||||
|
||||
uint64_t h = seed ^ (len * m);
|
||||
|
||||
const uint64_t* data = (const uint64_t*)key;
|
||||
const uint64_t* data = reinterpret_cast<const uint64_t*>(key);
|
||||
const uint64_t* end = data + (len / 8);
|
||||
|
||||
while (data != end) {
|
||||
@@ -1767,7 +1811,7 @@ uint64_t VL_MURMUR64_HASH(const char* key) VL_PURE {
|
||||
h *= m;
|
||||
}
|
||||
|
||||
const unsigned char* data2 = (const unsigned char*)data;
|
||||
const unsigned char* data2 = reinterpret_cast<const unsigned char*>(data);
|
||||
|
||||
switch (len & 7) {
|
||||
case 7: h ^= uint64_t(data2[6]) << 48; /* fallthrough */
|
||||
@@ -2146,7 +2190,6 @@ VlReadMem::VlReadMem(bool hex, int bits, const std::string& filename, QData star
|
||||
if (VL_UNLIKELY(!m_fp)) {
|
||||
// We don't report the Verilog source filename as it slow to have to pass it down
|
||||
VL_WARN_MT(filename.c_str(), 0, "", "$readmem file not found");
|
||||
// cppcheck-has-bug-suppress resourceLeak // m_fp is nullptr
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2286,7 +2329,6 @@ VlWriteMem::VlWriteMem(bool hex, int bits, const std::string& filename, QData st
|
||||
m_fp = std::fopen(filename.c_str(), "w");
|
||||
if (VL_UNLIKELY(!m_fp)) {
|
||||
VL_FATAL_MT(filename.c_str(), 0, "", "$writemem file not found");
|
||||
// cppcheck-has-bug-suppress resourceLeak // m_fp is nullptr
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2461,16 +2503,15 @@ void VL_WRITEMEM_N(bool hex, // Hex format, else binary
|
||||
// Timescale conversion
|
||||
|
||||
static const char* vl_time_str(int scale) VL_PURE {
|
||||
static const char* const names[]
|
||||
static const char* const s_names[]
|
||||
= {"100s", "10s", "1s", "100ms", "10ms", "1ms", "100us", "10us", "1us",
|
||||
"100ns", "10ns", "1ns", "100ps", "10ps", "1ps", "100fs", "10fs", "1fs"};
|
||||
if (VL_UNLIKELY(scale > 2 || scale < -15)) scale = 0;
|
||||
return names[2 - scale];
|
||||
return s_names[2 - scale];
|
||||
}
|
||||
double vl_time_multiplier(int scale) VL_PURE {
|
||||
// Return timescale multiplier -18 to +18
|
||||
// For speed, this does not check for illegal values
|
||||
// cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond
|
||||
if (scale < 0) {
|
||||
static const double neg10[] = {1.0,
|
||||
0.1,
|
||||
@@ -2491,7 +2532,6 @@ double vl_time_multiplier(int scale) VL_PURE {
|
||||
0.0000000000000001,
|
||||
0.00000000000000001,
|
||||
0.000000000000000001};
|
||||
// cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond
|
||||
return neg10[-scale];
|
||||
} else {
|
||||
static const double pow10[] = {1.0,
|
||||
@@ -2513,7 +2553,6 @@ double vl_time_multiplier(int scale) VL_PURE {
|
||||
10000000000000000.0,
|
||||
100000000000000000.0,
|
||||
1000000000000000000.0};
|
||||
// cppcheck-has-bug-suppress arrayIndexOutOfBoundsCond
|
||||
return pow10[scale];
|
||||
}
|
||||
}
|
||||
@@ -2768,11 +2807,11 @@ void VerilatedContext::threads(unsigned n) {
|
||||
|
||||
if (m_threads == n) return; // To avoid unnecessary warnings
|
||||
m_threads = n;
|
||||
const unsigned hardwareThreadsAvailable = std::thread::hardware_concurrency();
|
||||
if (m_threads > hardwareThreadsAvailable) {
|
||||
VL_PRINTF_MT("%%Warning: System has %u hardware threads but simulation thread count set "
|
||||
"to %u. This will likely cause significant slowdown.\n",
|
||||
hardwareThreadsAvailable, m_threads);
|
||||
const unsigned threadsAvailableToProcess = VlOs::getProcessDefaultParallelism();
|
||||
if (m_threads > threadsAvailableToProcess) {
|
||||
VL_PRINTF_MT("%%Warning: Process has %u hardware threads available, but simulation thread "
|
||||
"count set to %u. This will likely cause significant slowdown.\n",
|
||||
threadsAvailableToProcess, m_threads);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2809,7 +2848,7 @@ void VerilatedContext::internalsDump() const VL_MT_SAFE {
|
||||
VerilatedImp::userDump();
|
||||
}
|
||||
|
||||
void VerilatedContext::addModel(VerilatedModel* modelp) {
|
||||
void VerilatedContext::addModel(const VerilatedModel* modelp) {
|
||||
if (!quiet()) {
|
||||
// CPU time isn't read as starting point until model creation, so that quiet() is set
|
||||
// Thus if quiet(), avoids slow OS read affecting some usages that make many models
|
||||
@@ -2820,11 +2859,13 @@ void VerilatedContext::addModel(VerilatedModel* modelp) {
|
||||
|
||||
// We look for time passing, as opposed to post-eval(), as embedded
|
||||
// models might get added inside initial blocks.
|
||||
if (VL_UNLIKELY(time()))
|
||||
VL_FATAL_MT(
|
||||
"", 0, "",
|
||||
"Adding model when time is non-zero. ... Suggest check time(), or for restarting"
|
||||
" model use a new VerilatedContext");
|
||||
if (VL_UNLIKELY(time())) {
|
||||
const std::string msg
|
||||
= "Adding model '"s + modelp->hierName()
|
||||
+ "' when time is non-zero. ... Suggest check time(), or for restarting"
|
||||
" model use a new VerilatedContext";
|
||||
VL_FATAL_MT("", 0, "", msg.c_str());
|
||||
}
|
||||
|
||||
threadPoolp(); // Ensure thread pool is created, so m_threads cannot change any more
|
||||
m_threadsInModels += modelp->threads();
|
||||
@@ -2847,7 +2888,7 @@ VerilatedVirtualBase* VerilatedContext::threadPoolp() {
|
||||
void VerilatedContext::prepareClone() { delete m_threadPool.release(); }
|
||||
|
||||
VerilatedVirtualBase* VerilatedContext::threadPoolpOnClone() {
|
||||
if (VL_UNLIKELY(m_threadPool)) m_threadPool.release();
|
||||
if (VL_UNLIKELY(m_threadPool)) (void)m_threadPool.release();
|
||||
m_threadPool = std::unique_ptr<VlThreadPool>(new VlThreadPool{this, m_threads - 1});
|
||||
return m_threadPool.get();
|
||||
}
|
||||
@@ -3061,7 +3102,9 @@ void VerilatedContext::statsPrintSummary() VL_MT_UNSAFE {
|
||||
= vl_timescaled_double((cputime != 0.0) ? (simtimeInUnits / cputime) : 0, "%0.3f %s");
|
||||
VL_PRINTF("- Verilator: %s at %s; walltime %0.3f s; speed %s/s\n", endwhy.c_str(),
|
||||
simtime.c_str(), walltime, simtimePerf.c_str());
|
||||
const double modelMB = VlOs::memUsageBytes() / 1024.0 / 1024.0;
|
||||
uint64_t memPeak, memCurrent;
|
||||
VlOs::memUsageBytes(memPeak /*ref*/, memCurrent /*ref*/);
|
||||
const double modelMB = memPeak / 1024.0 / 1024.0;
|
||||
VL_PRINTF("- Verilator: cpu %0.3f s on %u threads; alloced %0.0f MB\n", cputime,
|
||||
threadsInModels(), modelMB);
|
||||
}
|
||||
@@ -3126,7 +3169,7 @@ void VerilatedContext::trace(VerilatedTraceBaseC* tfp, int levels, int options)
|
||||
VL_FATAL_MT("", 0, "",
|
||||
"Testbench C call to 'VerilatedContext::trace()' requires model(s) Verilated"
|
||||
" with --trace-fst or --trace-vcd option");
|
||||
for (auto& cbr : m_ns.m_traceBaseModelCbs) cbr(tfp, levels, options);
|
||||
for (const auto& cbr : m_ns.m_traceBaseModelCbs) cbr(tfp, levels, options);
|
||||
}
|
||||
void VerilatedContext::traceBaseModelCbAdd(traceBaseModelCb_t cb) VL_MT_SAFE {
|
||||
// Model creation registering a callback for when Verilated::trace() called
|
||||
@@ -3141,7 +3184,6 @@ VerilatedSyms::VerilatedSyms(VerilatedContext* contextp)
|
||||
: _vm_contextp__(contextp ? contextp : Verilated::threadContextp()) {
|
||||
VerilatedContext::checkMagic(_vm_contextp__);
|
||||
Verilated::threadContextp(_vm_contextp__);
|
||||
// cppcheck-has-bug-suppress noCopyConstructor
|
||||
__Vm_evalMsgQp = new VerilatedEvalMsgQueue;
|
||||
}
|
||||
|
||||
@@ -3381,7 +3423,7 @@ VerilatedModule::VerilatedModule(const char* namep)
|
||||
|
||||
VerilatedModule::~VerilatedModule() {
|
||||
// Memory cleanup - not called during normal operation
|
||||
// NOLINTNEXTLINE(google-readability-casting)
|
||||
// cppcheck-suppress cstyleCast // NOLINTNEXTLINE(google-readability-casting)
|
||||
if (m_namep) VL_DO_CLEAR(free((void*)(m_namep)), m_namep = nullptr);
|
||||
}
|
||||
|
||||
@@ -3543,16 +3585,16 @@ void VerilatedScope::scopeDump() const {
|
||||
VerilatedImp::exportName(i));
|
||||
}
|
||||
}
|
||||
if (const VerilatedVarNameMap* const varsp = this->varsp()) {
|
||||
for (const auto& i : *varsp) VL_PRINTF_MT(" VAR %p: %s\n", &(i.second), i.first);
|
||||
if (const VerilatedVarNameMap* const ivarsp = this->varsp()) {
|
||||
for (const auto& i : *ivarsp) VL_PRINTF_MT(" VAR %p: %s\n", &(i.second), i.first);
|
||||
}
|
||||
}
|
||||
|
||||
void VerilatedHierarchy::add(VerilatedScope* fromp, VerilatedScope* top) {
|
||||
void VerilatedHierarchy::add(const VerilatedScope* fromp, const VerilatedScope* top) {
|
||||
VerilatedImp::hierarchyAdd(fromp, top);
|
||||
}
|
||||
|
||||
void VerilatedHierarchy::remove(VerilatedScope* fromp, VerilatedScope* top) {
|
||||
void VerilatedHierarchy::remove(const VerilatedScope* fromp, const VerilatedScope* top) {
|
||||
VerilatedImp::hierarchyRemove(fromp, top);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user