隨著設計變得越來越複雜,要想產生乙個完整的激勵集來測試設計的功能也變得越來越困難。採用受約束的隨機測試法(crt)自動產生測試集是目前的一種主要的方法。crt由兩部分組成:使用隨機的資料流為dut產生輸入的測試**,以及偽隨機數發生器的種子。6.1 什麼需要隨機化
在產生隨機化的激勵時,我們最容易想到的就是使用$random函式。但是這種方法找bug的能力是十分有限的,它只能找到資料路徑的問題,或者是bit級別的錯誤。從某種意義上講,這種方法還是基於定向測試。那些具有挑戰性的bug大都在控制路徑裡面。因此,必須對dut裡所有關鍵點都採用隨機化技術。隨機化使控制路徑裡每乙個分支都可能被測試。你需要考慮設計輸入下列的各個方面。
6.2 systemverilog中的隨機化
基於oop使用systemverilog中的隨機激勵產生是最有效的。首先,建立乙個具有一組相關的隨機變數的類,然後用隨機函式為這些變數賦隨機值,你可以用約束來限制這些隨機值的範圍,使他們是有效的值,也可以某些專用的功能。
6.2.1 簡單的表示式
在乙個表示式中最多只能使用乙個關係操作符。
class order;
rand bit[7:0] lo,med,hi;
constraint bad ;
}endclass
6.2.4 在集合裡使用陣列
6.2.5 條件約束
通常約束塊裡所有的約束表示式都是有效的,但怎樣才能只讓乙個表示式在某些情況下有效呢?systemverilog支援兩種關係操作符:->和if-else。
class busop;
......
constraint c
if-else並不是包含在begin-end塊中,而是放在constraint的{}中。6.2.6雙向約束
約束塊並不想自上而下執行的程式性**,它們是宣告性**,是並行的,所有的約束表示式同時有效。
就算是在條件約束中,if-else語句中,並不是if中的語句成立才執行才執行下一條語句,而是所有的語句事先都已經知道。
6.3 解的概率
提到隨機,那麼概率必然與之相隨。systemverilog並不能保證求解器能夠給出確定的解,但是我們可以干預解得概率分布。
6.4 控制多個約束塊
在乙個類中可以包含多個約束塊。那麼我們應該如何去控制這些約束呢?
在執行期間,可以使用constraint_mode()函式來開啟或者關閉約束。
class test;
rand int src;
constraint c ;
}constraint c_1 ;
}endclass
test t;
initial begin
t=new();
t.c.constraint_mode(0);//關閉c
assert(t.randomize());
t.constraint_mode(0); //關閉所有的限制c和dst
t.c_1.constraint_mode(1);//開啟c_1這個約束
6.5 內嵌約束
systemverilog允許使用randomize()with來增加額外的約束,這和在類裡增加約束是等效的。
class test;
rand int src;
constraint c ;
}endclass
test t;
initial begin
t=new();
assert(randomize() with );
end
注意:在此處,with{}語句裡面類似於作用域,但是使用了變數src而不是t.src. mysql第六章 第六章 mysql日誌
第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...
第六章 指標
1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...
第六章總結
6.1 使用滑鼠 6.1.1 滑鼠時間和滑鼠訊息 根據使用者操作滑鼠時滑鼠的位置,滑鼠訊息分為兩類 客戶區滑鼠訊息和非客戶區滑鼠訊息。1.客戶去滑鼠訊息 2.當滑鼠游標位於視窗的使用者區時,將生成客戶滑鼠訊息。滑鼠訊息和鍵盤訊息有所不同,windows 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...