以下文章來(lái)源于ExASIC,作者陳鋒
介紹幾種自動(dòng)生成verilog代碼的方法。
f = open('mytest.v', 'w') # rtl = ... f.write(rtl)
說(shuō)明:這種方法相當(dāng)簡(jiǎn)單樸素,python做出需要的字符串,寫到文件。好處是不需要技巧,壞處是python代碼可維護(hù)性較差。
第二種:讀配置文件再生成
與第一種的差異是,把各種可配置的信息存到配置文件里,如excel、json、yaml,在腳本里讀取配置文件再用第一種方法生成字符串。
這種方法的好處是腳本相對(duì)固定,只需要修改配置文件就可以重新生成verilog代碼。但python腳本還是相對(duì)較亂,因?yàn)閺呐渲?a target="_blank">參數(shù)到目標(biāo)verilog中間需要各種字符串處理,如正則替換,format,進(jìn)制轉(zhuǎn)換等。當(dāng)目標(biāo)verilog的格式要求一變,python腳本還是需要重寫。
第三種:利用模板語(yǔ)言
現(xiàn)在我們來(lái)利用模板語(yǔ)言,比如jinja2,(https://docs.jinkan.org/docs/jinja2),把配置參數(shù)與目標(biāo)verilog格式拆分開來(lái)。
如下圖,有兩個(gè)模板,RTL模板和驗(yàn)證模板,用同一個(gè)配置參數(shù)經(jīng)過不同的模板,就可以得到不同的代碼。配置參數(shù)與模板轉(zhuǎn)換的過程是由模板引擎來(lái)實(shí)現(xiàn),不需要我們?cè)僦匦略燧喿印?/p>
這種方法的好處是只需要把精力花了編寫模板身上,而其它部分都是由現(xiàn)成的庫(kù)來(lái)實(shí)現(xiàn),這樣就只需要寫很少量的python代碼了。缺點(diǎn)是這種模板語(yǔ)言與Verilog語(yǔ)言本身有比較大的差異,需要稍微學(xué)習(xí)一下。
第四種:Verilog里內(nèi)嵌python
在Verilog代碼注釋里嵌入幾行python代碼,而保持大部分Verilog不動(dòng)。比如下面的例子:
always@(posedge clk, negedge rst_n) if(!rst_n) q[7:0] <= 8'b0; else begin // PYTHON_BEGIN // import random // data = [] // for i in range(8) // data.append(random.randint(0, 1)) // for i in range(8): // print('q[{}]'.format(data[i])) // PYTHON_END end
可見,這串代碼的注釋中用PYTHON_BEGIN和PYTHON_END括起了一段python代碼。我們需要提取出這段python,把python的執(zhí)行結(jié)果替換到原處。
當(dāng)然為了保證代碼可以再次生成,我們不能刪除python源碼,而是需要在注釋下方生成。重新生成時(shí)會(huì)先刪除PY_VLG_BEGIN和PY_VLG_END之間的verilog代碼。
always@(posedge clk, negedge rst_n) if(!rst_n) q[7:0] <= 8'b0; else begin // PYTHON_BEGIN // import random // data = [] // for i in range(8) // data.append(random.randint(0, 1)) // for i in range(8): // print('q[{}] <= {};'.format(i, data[i])) // PYTHON_END // PY_VLG_BEGIN q[0] <= 0; q[1] <= 1; q[2] <= 0; q[3] <= 0; q[4] <= 1; q[5] <= 1; q[6] <= 1; q[7] <= 0; // PY_VLG_END end
這個(gè)“提取->執(zhí)行->替換”的腳本具有通用性,編寫起來(lái)比較簡(jiǎn)單。不需要頻繁修改。
當(dāng)verilog里內(nèi)嵌的python功能接近,或者有共性時(shí),就可以把這種處理函數(shù)寫到一個(gè)py庫(kù)里,用時(shí)import進(jìn)來(lái)。
優(yōu)勢(shì):只需要維護(hù)一份verilog文件(不需要額外的python腳本了),對(duì)設(shè)計(jì)工程師友好。缺點(diǎn):每個(gè)公司都需要建立自己的共用py庫(kù),當(dāng)庫(kù)越來(lái)越龐大時(shí),新人或者換工作后就需要重新學(xué)習(xí)或者重新零開始。
第五種:第四種基礎(chǔ)上把常用規(guī)則提煉,做成開源工具
每個(gè)人單獨(dú)搞一套就會(huì)變得不可持續(xù)。可以以開源項(xiàng)目的方式,愛好者共同開發(fā)和維護(hù),不斷迭代,形成行業(yè)規(guī)范。例如:HDLGen(https://github.com/WilsonChen003/HDLGen)。
但很可能貢獻(xiàn)者有限,停止維護(hù),慢慢荒廢。
第六種:利用DSL來(lái)編寫代碼
比如SpinalHDL(https://thucgra.github.io/SpinalHDL_Chinese_Doc)、Chisel(https://www.chisel-lang.org)這種基于Scala的硬件開發(fā)工具。優(yōu)點(diǎn):有規(guī)范,行業(yè)標(biāo)準(zhǔn)。缺點(diǎn):創(chuàng)新得太徹底,學(xué)習(xí)成本非常高,遇到問題很難找到地方咨詢。并與現(xiàn)有的Verilog開發(fā)流程差異較大,DSL自成一套設(shè)計(jì)和驗(yàn)證的方法。
-
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109918 -
字符串
+關(guān)注
關(guān)注
1文章
570瀏覽量
20464 -
代碼
+關(guān)注
關(guān)注
30文章
4721瀏覽量
68213 -
python
+關(guān)注
關(guān)注
55文章
4766瀏覽量
84365
原文標(biāo)題:幾種自動(dòng)生成verilog代碼的方法
文章出處:【微信號(hào):芯司機(jī),微信公眾號(hào):芯司機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論