2016-04-20 122 views
0

我正在執行一項任務,我可以使用它從修改的ip hdr中獲取校驗和。這就是我得到的:crc ip verdog中的hdr校驗和

task checksum_calc; 
input [159:0] IP_hdr_data; 
output [15:0] IP_chksum; 
reg [19:0] IP_chksum_temp; 
reg [19:0] IP_chksum_temp1; 
reg [19:0] IP_chksum_temp2; 
begin 
    IP_chksum_temp = IP_hdr_data[15:0] + IP_hdr_data[31:16] + IP_hdr_data[47:32] + IP_hdr_data[63:48] + IP_hdr_data[79:64] + IP_hdr_data[111:96] + IP_hdr_data[127:112] + IP_hdr_data[143:128] + IP_hdr_data[159:144]; 
    IP_chksum_temp1 = IP_chksum_temp[15:0] + IP_chksum_temp[19:16]; 
    IP_chksum_temp2 = IP_chksum_temp1[15:0] + IP_chksum_temp1[19:16]; 
    IP_chksum = ! IP_chksum_temp2[15:0]; 
end 
endtask 

這是正確的嗎?或者由於使用了通用邏輯而導致一些計時問題?

回答

0

看起來你正在做的是一些組合邏輯計算。功能是一個更好的選擇。函數的主要目的是返回要在表達式中使用的值。

0

這是一個巨大的組合邏輯,在大多數情況下都會導致計時問題。 更好地運行它通過綜合和時間檢查來知道確切的結果。

一個建議作爲

IP_chksum_temp1 = IP_chksum_temp[15:0] + IP_chksum_temp[19:16]; 

只能產生翻轉第16位。因此,下一個加法中不需要20位。

IP_chksum_temp2 = IP_chksum_temp1[15:0] + IP_chksum_temp1[19:16]; 

這是可以做到: -

reg [16:0] IP_chksum_temp1; 
reg [16:0] IP_chksum_temp2;