Vivado在前一段時(shí)間更新了2023.2版本,經(jīng)過(guò)一段時(shí)間的使用這個(gè)版本還是很絲滑的,用起來(lái)挺舒服。
特別是增加了一個(gè)Lint檢查的按鈕,可以讓我們提前知道RTL設(shè)計(jì)有什么風(fēng)險(xiǎn)。做數(shù)字IC設(shè)計(jì)的時(shí)候?qū)懲甏a之后可能不是直接就去仿真,而是先拿Spyglass做一次檢查,消除掉lint錯(cuò)誤之后再拿去仿真,Vivado增加了這個(gè)功能,讓我們能夠更好的去掌控自己的代碼。
這個(gè)lint檢查有什么作用呢,先來(lái)看一小段代碼。
`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
沒(méi)有幾行代碼,直接一看有兩處問(wèn)題,第一是c在always begin end里面進(jìn)行賦值的,應(yīng)該用reg類型,第二會(huì)產(chǎn)生一個(gè)latch。
代碼比較少,可以一眼發(fā)現(xiàn)問(wèn)題,如果代碼比較多呢,還能一眼發(fā)現(xiàn)問(wèn)題嗎?之前版本沒(méi)有l(wèi)int檢查的時(shí)候,我們會(huì)拿去直接綜合,也許會(huì)給我們報(bào)一個(gè)警告出來(lái),但是又有多少次我們會(huì)去一個(gè)一個(gè)的看這個(gè)警告報(bào)的什么問(wèn)題呢?
現(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
先來(lái)綜合一下看看,下面是報(bào)告。
看起來(lái)一點(diǎn)問(wèn)題都沒(méi)有,報(bào)了一大堆信息,也許你仔細(xì)看還能看到其中一條警告說(shuō)c被綜合成一個(gè)latch了,要是信息更多的話還會(huì)看到他不。
而運(yùn)行l(wèi)int之后,會(huì)幫我們生成一個(gè)表,可以很清晰的看到這些信息:
再來(lái)看另外一個(gè)典型的多驅(qū)動(dòng)問(wèn)題:
`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
在綜合后會(huì)有一個(gè)關(guān)鍵警告產(chǎn)生,但也不會(huì)報(bào)錯(cuò),這個(gè)會(huì)在之后的布局布線的時(shí)候報(bào)錯(cuò)。
同樣lint也會(huì)把這個(gè)問(wèn)題給暴露出來(lái):
還有一些小問(wèn)題比如位寬不匹配的問(wèn)題,lint也能幫我們查出來(lái)
`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
不知道大家能一眼看出來(lái)這個(gè)代碼的問(wèn)題不。
先看看綜合的結(jié)果:
看著似乎沒(méi)啥問(wèn)題。
lint報(bào)了一堆位寬不匹配的問(wèn)題。
先看看第一個(gè)kkk的位寬不匹配,可以看到在在submodule這個(gè)模塊里面輸出了一個(gè)4bit的變量,但是我們?cè)诶@個(gè)模塊的時(shí)候kkk忘記定義了,這個(gè)時(shí)候kkk就被隱式推斷為了一個(gè)1bit的wire類型的變量,這樣就出現(xiàn)了潛在的bug。其他幾個(gè)位寬不匹配也是一樣的,當(dāng)然不是所有的位寬不匹配都是bug,這個(gè)就需要我們明確知道哪些是我們故意這樣設(shè)計(jì)的。
通過(guò)觀察lint報(bào)告,可以讓我們更加了解自己的設(shè)計(jì),讓問(wèn)題發(fā)現(xiàn)在最開(kāi)始的地方,而不是等到最后布局布線了甚至更晚,才發(fā)現(xiàn)這種低級(jí)的問(wèn)題。
審核編輯:湯梓紅
-
IC設(shè)計(jì)
+關(guān)注
關(guān)注
38文章
1343瀏覽量
105039 -
仿真
+關(guān)注
關(guān)注
51文章
4212瀏覽量
135056 -
RTL
+關(guān)注
關(guān)注
1文章
388瀏覽量
60517 -
代碼
+關(guān)注
關(guān)注
30文章
4880瀏覽量
69998 -
Vivado
+關(guān)注
關(guān)注
19文章
825瀏覽量
67911
原文標(biāo)題:Vivado2023.2的一個(gè)小功能
文章出處:【微信號(hào):FPGA開(kāi)源工坊,微信公眾號(hào):FPGA開(kāi)源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Vitis2023.2使用之—— updata to Vitis Unified IDE
Hanlp1.7版本的新增功能一覽
怎么將vivado12.3更新到最新的15.4版本?
Xilinx 發(fā)布Vivado2013.3新增全新設(shè)計(jì)方法及功能
Xilinx發(fā)布Vivado 2013.3 新增全新設(shè)計(jì)方法及功能
賽靈思Vivado設(shè)計(jì)套件推出2013.1版本,提供IP 集成器和高層次綜合功能
Vivado設(shè)計(jì)套件2017.3的新功能介紹

Vivado Design Suite 2015.3新增量編譯功能介紹
Vivado Design Suite 2018.1設(shè)計(jì)套件中的新增功能介紹

Vivado 2015.3中的新增量編譯功能介紹
Vivado 2015.3的新增量編譯功能
Vivado? 設(shè)計(jì)套件 2023.2 版本:加速自適應(yīng) SoC 和 FPGA 產(chǎn)品設(shè)計(jì)
Vitis2023.2全新GUI的功能特性介紹

使用Vivado通過(guò)AXI Quad SPI實(shí)現(xiàn)XIP功能

評(píng)論