1、超時判斷機制
在設計中,為了增加異常處理能力,保證設備的正常運行,常常需要進行超時判斷。
如下圖,當master發起mem讀請求后,收到讀返回數據時,進行超時判斷,如果超時,則數據丟棄,如果沒有超時,則數據正常接收。
2、一種簡單的超時機制
如果在數據發送過程中,發送者向接收者發送數據,通常需要接收者通知發送者自身是否可以接收數據
采用一個公共的32bit clk_cnt作為時間基準,根據不同的超時精度,采用32bit中的連續2bit,1GHz時鐘,每個周期1n,例如采用clk_cnt[20:19],可以記錄2^21ns級別的精度,即2ms級別的時間精度。
本文中master能夠發起256個outstanding請求,req_id[7:0]從0到255,且工作時鐘clk為1Ghz,發起的mem讀請求,且在1us后都沒有收到數據,則認為超時。
步驟1:master發起mem_rd請求時,以req_id作為地址,將clk_cnt[20:19]作為data,寫入256x2 1r1w_ram中。
步驟2:當master收到讀返回數據時,以req_id作為地址從ram中讀取data,記作clk_cnt_record
步驟3:提取當前時刻clk_cnt[20:19],記錄為clk_cnt_now,如果clk_cnt_now-clk_cnt_record 的絕對值大于1,則表示超時。
案例:
clk_cnt_record 為 10,clk_cnt_now為00,則表示超時。
clk_cnt_record 為 10,clk_cnt_now為11,則認為不超時。
3、特點說明
優點:此類設計比較簡單,所需的邏輯資源較少,并且可以調節超時時間精度。
缺點:
1.如果超時時間過長,已經從clk_cnt_record翻轉了一圈再返回時,則無法判斷是否為超時。即clk_cnt_record(10)-->11-->00-->01-->10-->11(clk_cnt_now),實際已超時,但是判斷為沒有超時。
2.沒有讀返回數據時,無法判斷是否超時。
verilog語法:幾種可綜合的for循環語句
1、采用int實現不同信號賦值的循環
在同一個.v文件中,在不同的場景中,我們想例化不同的ram,如果不使用宏定義,那么該怎么實現呢?
直接采用for(int*)類型格式,可以在一個else分支中使用,不需要使用generate,使用更加靈活,使用范圍更廣。
input [1024-1:0] func_mode_in;
reg [512-1:0] func_id_vld;
always@(posedge clk)
if(~rst_n) begin
func_id_vld <= 512'b0 ;
end else begin
for(int i=0; i<512;i=i+1) begin : func_id_vld_gen
func_id_vld[i] <= (func_mode_in[2*i+:2]==2'b01) ;
end
end
2、采用int實現同一個信號賦值的循環
下圖所示,采用for(int*)類型格式實現了一個16mux1的循環賦值語句,實現不同條件一下,對debug_test_16mux1的賦值操作,即16mux1的邏輯。
input [128*16-1:0] debug_test_in;
input [4-1:0] cfg_16mux1_mode;
reg [128-1:0] debug_test_16mux1;
begin
debug_test_16mux1 = 128'd0;
i=0; i<16;i=i+1) begin : debug_test_16mux1_gen
=i) begin =
debug_test_16mux1 = debug_test_in[128*i+:128] ;
break ;
end
end
end
如上for循環語句實現了如下的case語句效果
begin
case(cfg_16mux1_mode)
0 : debug_test_16mux1 = debug_test_in[127 :0 ];
1 : debug_test_16mux1 = debug_test_in[255 :128 ];
2 : debug_test_16mux1 = debug_test_in[383 :256 ];
3 : debug_test_16mux1 = debug_test_in[511 :384 ];
4 : debug_test_16mux1 = debug_test_in[639 :512 ];
5 : debug_test_16mux1 = debug_test_in[767 :640 ];
6 : debug_test_16mux1 = debug_test_in[895 :768 ];
7 : debug_test_16mux1 = debug_test_in[1023 :896 ];
8 : debug_test_16mux1 = debug_test_in[1151 :1024 ];
9 : debug_test_16mux1 = debug_test_in[1279 :1152 ];
10: debug_test_16mux1 = debug_test_in[1407 :1280 ];
11: debug_test_16mux1 = debug_test_in[1535 :1408 ];
12: debug_test_16mux1 = debug_test_in[1663 :1536 ];
13: debug_test_16mux1 = debug_test_in[1791 :1664 ];
14: debug_test_16mux1 = debug_test_in[1919 :1792 ];
15: debug_test_16mux1 = debug_test_in ;
endcase
end
NOTE:在for(int*)語句中,debug_test_16mux1 = debug_test_in[128*i+127:128*i] ; 會報語法錯誤,語法錯誤,只識別debug_test_in[128*i+:128]而無法識別debug_test_in[128*i+127:128*i] ,否則VCS會報語法錯誤。
審核編輯 :李倩
-
數據
+關注
關注
8文章
7104瀏覽量
89293 -
IC設計
+關注
關注
38文章
1298瀏覽量
104133 -
機制
+關注
關注
0文章
24瀏覽量
9808
原文標題:IC知識點:超時機制、verilog語法
文章出處:【微信號:IP與SoC設計,微信公眾號:IP與SoC設計】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論