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


2016年1月6日 星期三

FPGA 速度架構筆記(Timing)

Reference Book : Advanced FPGA Design by Steve Kilts
這篇文章僅是記錄對我來說重要的部分,細節請參閱參考書籍, 這本書真的是本好書!

決定FPGA的速度有三大因素 throughput, latency, timing
Throughtput :  每秒可以處理的資料量(bits per second)
Latency :  輸入資料與輸出處理過後的資料之間的時間(time or clock cycle)
Timing :  sequential element之間的logic delay (clock period or frequency), 如果設計沒有”meet  
                 timing” 表示critical path 大於clock period


系統中兩個sequential element中的最大延遲會決定系統的max speed

Tclk-q is time from clock arrival until data arrives at Q;
Tlogic is propagation delay through logic between flip-flops;
Trouting is routing delay between flip-flops;
Tsetup is minimum time datamust arrive at D before the next rising edge of clock (setup time);
Tskew is propagation delay of clock between the launch flip-flop and the capture flip-flop.

要提高max speed有五種方法可以使用(Add Register Layers, Parallel Structures, Flatten Logic Structure, Register Balancing, Reorder Path)


Add Register Layers
critical path分段拆成幾個小path,但要先確定增加的clock cycle不會影響design specifications functionality
例如Y <= A* X+B* X1+C* X2; 拆成
prod1 <= A * X;
prod2 <= B * X1;
prod3 <= C * X2;
Y <= prod1 + prod2 + prod3;


Parallel Structures
這方法是把連續的邏輯平行處理,譬如一個8 bits的乘法器.可以拆成兩個四位元的來同時處理,再把結果合併起來


例子比較龐大,在書中第九頁,這個方法可以降低path delay


Flatten Logic Structures
這個方法跟Parallel Structures類似,但是用在priority encoding上面,例如下面的例子, synthesis and layout tools are smart enough to duplicate logic to reduce fanout, but they are not smart enough to break up logic structures that are coded in a serial fashion


// reference from : Advanced FPGA Design by Steve Kilts

module regwrite(
 input [3:0] ctrl,
 input clk,in,
 output reg [3:0] rout);
 
always@(posedge clk)
 if(ctrl[0]) rout[0] <= in;
 else if(ctrl[1]) rout[1] <= in;
 else if(ctrl[2]) rout[2] <= in;
 else if(ctrl[3]) rout[3] <= in;

end module



這樣寫法系統會自動合成address decoder,每個訊號都是互斥或,會增加path delay
所以作者推薦把 if else 打散,把條件平等化,依照順序寫也可做到priority control的效果,且可以減少path delay,因為每個訊號不互相影響


// reference from : Advanced FPGA Design by Steve Kilts
module regwrite(
 input [3:0] ctrl,
 input clk,in,
 output reg [3:0] rout);
 
always@(posedge clk)
 if(ctrl[0]) rout[0] <= in;
 if(ctrl[1]) rout[1] <= in;
 if(ctrl[2]) rout[2] <= in;
 if(ctrl[3]) rout[3] <= in;

end module


Register Balancing
這方法用來縮小兩個reg之間的最大延遲
例如下列這樣的寫法,critical path會存在Sum <= rA + rB + rC;
rA <= A;
rB <= B;
rC <= C;
Sum <= rA + rB + rC;
因此改成下面balance的寫法可以縮小critical path delay
rABSum <= A + B;
rC <= C;
Sum <= rABSum + rC;


Reorder Paths
若有數個pathcritical path連在一起,可將這些path重新組合,critical path接近destination register
例如下面例子


// reference from : Advanced FPGA Design by Steve Kilts

module randomlogic(
 input [7:0] A,B,C,
 input clk,
 input Cond1, Cond2,
 output reg [7:0] Out);
 
always@(posedge clk)
begin
 if(Cond1)
  Out <= A;
 else if(Cond2 && (C < 8))
  Out <= B;
 else
  Out <= C;
end 
end module

假設cout之間為critical path,C需要越過兩個gate來到mux(if else)
因此若把程式重新排列如下,就可以減少一級,見書中15頁的圖會更清楚


// reference from : Advanced FPGA Design by Steve Kilts
module randomlogic(
 input [7:0] A,B,C,
 input clk,
 input Cond1, Cond2,
 output reg [7:0] Out);
 
wire CondB = (Cond2 & !Cond1)

always@(posedge clk)
begin
 if(CondB && (C < 8))
  Out <= B;
 else if(Cond1)
  Out <= B;
 else
  Out <= C;
end 
end module


結論就是要把較複雜的比較式寫在前面,這樣可以減少critical path delay