Vivado在前一段時間更新了2023.2版本,經過一段時間的使用這個版本還是很絲滑的,用起來挺舒服。
特別是增加了一個Lint檢查的按鈕,可以讓我們提前知道RTL設計有什么風險。做數字IC設計的時候寫完代碼之后可能不是直接就去仿真,而是先拿Spyglass做一次檢查,消除掉lint錯誤之后再拿去仿真,Vivado增加了這個功能,讓我們能夠更好的去掌控自己的代碼。
這個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里面進行賦值的,應該用reg類型,第二會產生一個latch。
代碼比較少,可以一眼發現問題,如果代碼比較多呢,還能一眼發現問題嗎?之前版本沒有lint檢查的時候,我們會拿去直接綜合,也許會給我們報一個警告出來,但是又有多少次我們會去一個一個的看這個警告報的什么問題呢?
現在增加了Lint功能,直接點擊run一下看看。
vivado直接報錯了,告訴我們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
先來綜合一下看看,下面是報告。
看起來一點問題都沒有,報了一大堆信息,也許你仔細看還能看到其中一條警告說c被綜合成一個latch了,要是信息更多的話還會看到他不。
而運行lint之后,會幫我們生成一個表,可以很清晰的看到這些信息:
再來看另外一個典型的多驅動問題:
`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
在綜合后會有一個關鍵警告產生,但也不會報錯,這個會在之后的布局布線的時候報錯。
同樣lint也會把這個問題給暴露出來:
還有一些小問題比如位寬不匹配的問題,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
不知道大家能一眼看出來這個代碼的問題不。
先看看綜合的結果:
看著似乎沒啥問題。
lint報了一堆位寬不匹配的問題。
先看看第一個kkk的位寬不匹配,可以看到在在submodule這個模塊里面輸出了一個4bit的變量,但是我們在例化這個模塊的時候kkk忘記定義了,這個時候kkk就被隱式推斷為了一個1bit的wire類型的變量,這樣就出現了潛在的bug。其他幾個位寬不匹配也是一樣的,當然不是所有的位寬不匹配都是bug,這個就需要我們明確知道哪些是我們故意這樣設計的。
通過觀察lint報告,可以讓我們更加了解自己的設計,讓問題發現在最開始的地方,而不是等到最后布局布線了甚至更晚,才發現這種低級的問題。
審核編輯:湯梓紅
-
IC設計
+關注
關注
38文章
1295瀏覽量
103918 -
仿真
+關注
關注
50文章
4070瀏覽量
133552 -
RTL
+關注
關注
1文章
385瀏覽量
59760 -
代碼
+關注
關注
30文章
4779瀏覽量
68521 -
Vivado
+關注
關注
19文章
812瀏覽量
66470
原文標題:Vivado2023.2的一個小功能
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論