2016-04-20 78 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;