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
沒有幾行代碼,直接一看有兩處問題,第一是c在always begin end里面進(jìn)行賦值的,應(yīng)該用reg類型,第二會(huì)產(chǎn)生一個(gè)latch。
代碼比較少,可以一眼發(fā)現(xiàn)問題,如果代碼比較多呢,還能一眼發(fā)現(xiàn)問題嗎?之前版本沒有l(wèi)int檢查的時(shí)候,我們會(huì)拿去直接綜合,也許會(huì)給我們報(bào)一個(gè)警告出來(lái),但是又有多少次我們會(huì)去一個(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
先來(lái)綜合一下看看,下面是報(bào)告。
看起來(lái)一點(diǎn)問題都沒有,報(bào)了一大堆信息,也許你仔細(xì)看還能看到其中一條警告說(shuō)c被綜合成一個(gè)latch了,要是信息更多的話還會(huì)看到他不。
而運(yùn)行l(wèi)int之后,會(huì)幫我們生成一個(gè)表,可以很清晰的看到這些信息:
再來(lái)看另外一個(gè)典型的多驅(qū)動(dòng)問題:
`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è)問題給暴露出來(lái):
還有一些小問題比如位寬不匹配的問題,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è)代碼的問題不。
先看看綜合的結(jié)果:
看著似乎沒啥問題。
lint報(bào)了一堆位寬不匹配的問題。
先看看第一個(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ì),讓問題發(fā)現(xiàn)在最開始的地方,而不是等到最后布局布線了甚至更晚,才發(fā)現(xiàn)這種低級(jí)的問題。
審核編輯:湯梓紅
-
IC設(shè)計(jì)
+關(guān)注
關(guān)注
38文章
1302瀏覽量
104304 -
仿真
+關(guān)注
關(guān)注
50文章
4125瀏覽量
134031 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59966 -
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69091 -
Vivado
+關(guān)注
關(guān)注
19文章
815瀏覽量
66911
原文標(biāo)題:Vivado2023.2的一個(gè)小功能
文章出處:【微信號(hào):FPGA開源工坊,微信公眾號(hào):FPGA開源工坊】歡迎添加關(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的新功能介紹
![<b class='flag-5'>Vivado</b>設(shè)計(jì)套件2017.3的新<b class='flag-5'>功能</b>介紹](https://file.elecfans.com/web1/M00/70/F2/o4YBAFv1MbOAPFgXAAAaJEkO7-M064.jpg)
Vivado Design Suite 2015.3新增量編譯功能介紹
Vivado Design Suite 2018.1設(shè)計(jì)套件中的新增功能介紹
![<b class='flag-5'>Vivado</b> Design Suite 2018.1設(shè)計(jì)套件中的<b class='flag-5'>新增</b><b class='flag-5'>功能</b>介紹](https://file.elecfans.com/web1/M00/71/5F/pIYBAFv1MzuARNEHAAAvCbFGVmA008.jpg)
Vivado 2015.3中的新增量編譯功能介紹
Vivado 2015.3的新增量編譯功能
Vivado? 設(shè)計(jì)套件 2023.2 版本:加速自適應(yīng) SoC 和 FPGA 產(chǎn)品設(shè)計(jì)
Vitis2023.2全新GUI的功能特性介紹
![Vitis<b class='flag-5'>2023.2</b>全新GUI的<b class='flag-5'>功能</b>特性介紹](https://file1.elecfans.com/web2/M00/BB/09/wKgZomWXXuOAPXQlAAAV7sAFNzs472.png)
使用Vivado通過(guò)AXI Quad SPI實(shí)現(xiàn)XIP功能
![使用<b class='flag-5'>Vivado</b>通過(guò)AXI Quad SPI實(shí)現(xiàn)XIP<b class='flag-5'>功能</b>](https://file1.elecfans.com/web1/M00/F3/E2/wKgZoWcggI2Ady3sAAAcY8ufVo8103.png)
評(píng)論