2018年3月29日 星期四

Systemverilog 筆記 - Assertions



create Boolean expression -> create sequence expression ->  create property(concurrent) -> assert property


uprange sign $
overlapped implication |->
non-overlapped implication |=>
consecutive repetition [*n]
go-to repetition [->]
non-consecutive repetition [=min_times:max_times]
$rose 回傳true,如果LSB轉換到1
$fell  回傳true,如果LSB轉換到0
$stable 回傳true如果沒有轉換準位
$past 是針對前一個clock來取樣,但是傳回值是在現在的clock

##1  經過一個clock cycle delay

a ##2 b  a 的兩個周期以後出現b才會trigger

a ##[1:$]  b  a active 後的任一周期 b active 才會trigger

(a ##2 b) |-> c  a active後兩個周期b active ,同時cactive

(a ##2 b) |=> c  a active後兩個周期b active ,一個週期後c active

(a ##1 b) [*2]  a active後一個周期b active , 這樣的情況要重複兩次

a ##1 (b[*4])  a active後一個周期b要連續active 四個周期

(a ##1 b) [*1  2] = (a ##1 b) or (a ##1 b) ##1 (a ##1 b)  a active後一個周期bactive 一個周期, 這種情形重複一次或是兩次

(a[*1:2] ##1 b)  a active一或是二個周期, 一周期後,b active

a |=> b[=2]  a active 後的下一個周期b 要至少active 兩次(不用連續)

a ##2 b [=3:4] ##1 c  a active 兩個周期之後, b 經過最少三次最多四次active, 一個周期後c active

a |=> b[->2]  a active 後的下一個周期b active 兩次(不用連續)

a |=> (b[->2] ##2 c)  a active 後的下一個周期b active 兩次(不用連續), 兩周期後c active

(a ##2 b) and (c ##3 d)  and 檢查這兩個序列是否都合格,這兩個序列必須要有相同的起始點, 如果第一個序列比對成功,會等待第二個序列成功, 最後成功時間為第二序列時間

(a ##2 b) or (c ##3 d)  or 檢查這兩個序列是否其中一個合格,這兩個序列必須要有相同的起始點, 時間為最先成功的時間

<anteceent> throughout <consequent> concequent antecedentactive,必須比對成功,否則會回傳false
(!en) throughout ##2 (reg ##[0:4] gnt) en0的時候, 兩個周期之後 reg 必須為1,且在最小0周期最大四周期的時候 gnt1

(a ##[2:4] b) intersect (c ##[3:4] d) intersectand 相似, 不同的是其要求兩個序列比須有相同的比對成功長度, 上面第一個如果2T 3T 4T 比對成功,第二個3T 4T 成功,這樣只會傳回3T 4T

first_match(a ##[2:4] b) first_match(c ##1 d) 如果比對成功處均在同一個地方結束,則濾出第一個比對成功的地方, 如果序列是在不同的地方結束,則其為讓每一個比對成功處為true









2018年3月23日 星期五

Systemverilog 筆記 - Interface

interface應該要是獨立的一個file,不要寫在module

modport 只是用來定義方向,不用標註型態跟大小

只有function可以合成,task,initial block,always block, assersion 都不能合成, task可以用void  function來取代, 如果有用到這些可以用synthesis translate_off, tanslate_on 或是`ifdef來控制

interface裡面也可以包含其他的interface

interfaceport 不能空接,不然會有elaboration error 

盡量使用短名,因為會經常被reference

interfacemodule有三點不同: interface裡面不能有階層設計,interface可以整個被當成一個port來連接在module上面,interface可以有modport

type-specific interface ports (module <module_name> (<interface_name> <port_name >), 不要用generic(module <module name> (interface <port_name>))

interface instance來指定modport (<interface_instance_name>.<modport_name >)
如果interface裡面沒有被指定modport,則所有的nets都會被預設為雙向的inout,simulation,變數都會被架設為ref(不可合成)

interface裡面的function 必須要寫automatic , modport 可以用import函數名稱, 來使用函數, 也可以在import時將整個函式的參數標示出來,以方便查詢, import 函式不用在寫一次automatic

如果兩個模組之間溝通訊號超過兩個,就可以考慮使用interface,如果信號不段重複,如網路轉接,則必須使用virtual interface

Interface 裡面的非同步訊號最好用logic,但是如果有多個drive,則需用wire

Interface 裡面必須要有clocking來產生同步的訊號,避免race condition ,但是clocking只能用在testbench,不能合成

一個interface可以包括多個clocking block,但是每個clocking block只能有一個clock domain,通常用@(posedge clk), @( clk)表示DDR double data rate,定義clcoking block以後,之後可以直接用@arbif.cb,好處是如果要修改clock,可以直接修改clocking block即可,不用再修改testbench

可以用@或是wait來同步testbench裡面的訊號

如果modportclocking一起在interface裡面,這樣如果要使用訊號,需要經過interface prefixclocking.所以看上面的例子arbif.cb.request是合法的

如果想要延遲兩個clock cycle 可以用 repeat (2) @arbif.cb 或是##2

clocking裡面也可以用#來做延遲,可以寫default  input #10ns output 15ns