本文源自微信公眾號 :數字晶元實驗室
1、連續賦值和過程賦值之間有什麼區別?
2、initial和always中的賦值有什麼區別?initial和always中的賦值都是過程賦值。
3、阻塞和非阻塞賦值之間有什麼區別?阻塞和非阻塞賦值都是過程賦值。
4、如何使用連續賦值建模雙向nets?
assign語句構成一個連續賦值。 RHS變化立即影響LHS。 然而,LHS的任何變化都不會影響RHS。
System Verilog引入了一個關鍵字alias,能定義雙向nets。
如果上述alias換成assign,則輸出如下:
5、task和function之間有什麼區別?
Verilog中的task和function都可以實現常用功能,有助於代碼的清晰和可維護,避免在不同位置複製大量代碼。 本質上,task和function都提供了在模塊中不同位置重用相同代碼段的「子程序」機制。
6、靜態task和動態task有何不同?
動態task在關鍵字task和名稱之間有automatic關鍵字。 動態task在每個task調用期間,自動分配變數內存空間,即每次調用都不會覆蓋這些值。沒有automatic關鍵字,變數是靜態分配的,這意味著這些變數在不同的task調用之間共享,因此可以被覆蓋。
在上面的示例中,my_value是task中的局部變數。 每當調用此task時,輸入in_value在5個模擬時間單位之後賦值給局部變數。 在initial begin中,有一個fork-join,它啟動兩個並行進程,分別在模擬時間單位#1和#2之後開始。 第1個進程賦值2給my_value,第2個進程賦值3給my_value。 假設沒有automatic關鍵字,使用上面的代碼運行模擬,會輸出以下內容:
沒有automatic關鍵字的事件序列如下:
1. 從模擬時間0開始啟動fork-join兩個進程。
按照上述相同的步驟,這次,由於存在關鍵字automatic,變數不會被其他進程覆蓋。
7、如何覆蓋automatic task中的變數?
默認情況下,module中的所有變數都是靜態的。 但是, task/function中的變數都可以定義為static或automatic。
System Verilog引入了關鍵字static。 當task/function被明確定義為static,它的變數只分配一次內存,並且多次調用將覆蓋其變數。 、
8、如何沒有返回值地調用function?在Verilog 2001之前,任何function調用都必須返回一個值,調用function的代碼必須接收返回值。 例如,以下是語法錯誤:
上面例子中的一行是語法錯誤,因為調用了my_funct,卻沒有返回值。 只有task可以在沒有返回值的情況下調用。
上面的例子顯示了結果:
3、function返回值默認為1比特位寬
9、如何在例化時修改模塊的parameter值?
使用上述方法的限制是:
請注意,顯式地按parameter名稱指定修改方式,括弧中的值是修改的值。 在在U2實例化中,只需指定depth即可,無需為width指定任何修改值。
以下總結了使用defparam方法的優點:
10、如果阻止模塊例化時parameters不被改變
如果需要阻止模塊中的特定parameters被改變,應該使用localparam,而不是parameter。 localparam在Verilog-2001中引入。在以下示例中,localparam用於聲明num_bits,因此嘗試改變它會給出Error。
請注意,由於width和depth是使用parameter指定的,它們可以在實例化時被改變。
11、使用`define和parameter有什麼區別?
12、什麼是派生parameters?
使用派生parameters可以增強RTL代碼的可重用性。
13、層次化設計當中連接Ports的方法有哪些?各自的優缺點是什麼?1)按順序連接
2)按名稱連接
按名稱連接提高了port連接的可讀性, 和port聲明的順序不再相關,因為它們是顯示連接的。
3)按Interface連接
喜歡請別放棄