Vivado在前一段時(shí)間更新了2023.2版本,經(jīng)過一段時(shí)間的使用這個(gè)版本還是很絲滑的,用起來挺舒服。
特別是增加了一個(gè)Lint檢查的按鈕,可以讓我們提前知道RTL設(shè)計(jì)有什么風(fēng)險(xiǎn)。做數(shù)字IC設(shè)計(jì)的時(shí)候?qū)懲甏a之后可能不是直接就去仿真,而是先拿Spyglass做一次檢查,消除掉lint錯(cuò)誤之后再拿去仿真,Vivado增加了這個(gè)功能,讓我們能夠更好的去掌控自己的代碼。
這個(gè)lint檢查有什么作用呢,先來看一小段代碼。
`timescale 1ns / 1ps module top( input [7:0] a , input b , output [7:0] c ); always @(*) begin if(b == 1'b1)begin c = a; end end endmodule
沒有幾行代碼,直接一看有兩處問題,第一是c在always begin end里面進(jìn)行賦值的,應(yīng)該用reg類型,第二會產(chǎn)生一個(gè)latch。
代碼比較少,可以一眼發(fā)現(xiàn)問題,如果代碼比較多呢,還能一眼發(fā)現(xiàn)問題嗎?之前版本沒有l(wèi)int檢查的時(shí)候,我們會拿去直接綜合,也許會給我們報(bào)一個(gè)警告出來,但是又有多少次我們會去一個(gè)一個(gè)的看這個(gè)警告報(bào)的什么問題呢?
現(xiàn)在增加了Lint功能,直接點(diǎn)擊run一下看看。
vivado直接報(bào)錯(cuò)了,告訴我們c不是reg類型的。
把c改成reg類型的,代碼如下
`timescale 1ns / 1ps module top( input [7:0] a , input b , output reg [7:0] c ); always @(*) begin if(b == 1'b1)begin c = a; end end endmodule
先來綜合一下看看,下面是報(bào)告。
看起來一點(diǎn)問題都沒有,報(bào)了一大堆信息,也許你仔細(xì)看還能看到其中一條警告說c被綜合成一個(gè)latch了,要是信息更多的話還會看到他不。
而運(yùn)行l(wèi)int之后,會幫我們生成一個(gè)表,可以很清晰的看到這些信息:
再來看另外一個(gè)典型的多驅(qū)動問題:
`timescale 1ns / 1ps module top( input clk, input [7:0] a1 , input [7:0] a2 , input b , output reg [7:0] c ); always @(posedge clk) begin if(b == 1'b1)begin c <= a1; end end always @(posedge clk) begin c <= a2; end endmodule
在綜合后會有一個(gè)關(guān)鍵警告產(chǎn)生,但也不會報(bào)錯(cuò),這個(gè)會在之后的布局布線的時(shí)候報(bào)錯(cuò)。
同樣lint也會把這個(gè)問題給暴露出來:
還有一些小問題比如位寬不匹配的問題,lint也能幫我們查出來
`timescale 1ns / 1ps module top( input clk, input [7:0] a , input b , output reg [6:0] c ); always @(posedge clk) begin if(b == 3'b101)begin c <= a; end end submodule submodule_inst( .a (kkk) ) endmodule module submodule ( output [3:0] a ); assign a = 3'b111; endmodule
不知道大家能一眼看出來這個(gè)代碼的問題不。
先看看綜合的結(jié)果:
看著似乎沒啥問題。
lint報(bào)了一堆位寬不匹配的問題。
先看看第一個(gè)kkk的位寬不匹配,可以看到在在submodule這個(gè)模塊里面輸出了一個(gè)4bit的變量,但是我們在例化這個(gè)模塊的時(shí)候kkk忘記定義了,這個(gè)時(shí)候kkk就被隱式推斷為了一個(gè)1bit的wire類型的變量,這樣就出現(xiàn)了潛在的bug。其他幾個(gè)位寬不匹配也是一樣的,當(dāng)然不是所有的位寬不匹配都是bug,這個(gè)就需要我們明確知道哪些是我們故意這樣設(shè)計(jì)的。
通過觀察lint報(bào)告,可以讓我們更加了解自己的設(shè)計(jì),讓問題發(fā)現(xiàn)在最開始的地方,而不是等到最后布局布線了甚至更晚,才發(fā)現(xiàn)這種低級的問題。
審核編輯:湯梓紅
-
IC設(shè)計(jì)
+關(guān)注
關(guān)注
38文章
1296瀏覽量
103953 -
仿真
+關(guān)注
關(guān)注
50文章
4082瀏覽量
133606 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59785 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68611 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66531
原文標(biāo)題:Vivado2023.2的一個(gè)小功能
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論