基于sv的function函数写一个crc16 ccitt的函数
时间: 2024-03-15 20:46:24 浏览: 88
好的,以下是基于SV语言的crc16 ccitt函数:
```
FUNCTION crc16_ccitt (input: STRING) : INT
VAR
crc: INT := 0;
i, j: INT;
BEGIN
FOR i := 1 TO LEN(input) DO
crc := BITXOR(crc, INT(input[i]) << 8);
FOR j := 1 TO 8 DO
IF BITAND(crc, 0x8000) THEN
crc := BITXOR(BITSHIFTLEFT(crc, 1), 0x1021);
ELSE
crc := BITSHIFTLEFT(crc, 1);
END_IF;
END_FOR;
END_FOR;
RETURN crc;
END_FUNCTION
```
这个函数接受一个字符串作为输入,计算并返回其CRC16 CCITT校验值。它使用了SV语言中常见的位运算函数,比如BITXOR、BITAND和BITSHIFTLEFT,以及逐位迭代的循环结构。请注意,此函数仅供参考,具体实现可能因编程环境和要求而异。
相关问题
基于sv写一个关于crc16 ccitt的参考模型
好的,以下是一个参考模型:
```sv
class Crc16Ccitt;
localparam int WIDTH = 16;
localparam int POLY = 16'h1021;
localparam int INIT = 16'hffff;
localparam int XOROUT = 16'h0000;
bit [WIDTH-1:0] crc_reg;
function void reset();
crc_reg = INIT;
endfunction
function void update(bit [7:0] data);
for (int i = 0; i < 8; i++) begin
if ((crc_reg & 1) ^ (data & 1)) begin
crc_reg = {crc_reg[WIDTH-2:0], 1'b1} ^ POLY;
end else begin
crc_reg = {crc_reg[WIDTH-2:0], 1'b0};
end
data = data >> 1;
end
endfunction
function bit [WIDTH-1:0] get_crc();
return crc_reg ^ XOROUT;
endfunction
endclass
```
该参考模型实现了一个基于CRC-16-CCITT标准的CRC计算器,使用了一个16位的寄存器来存储CRC值,并提供了reset、update和get_crc等三个方法。
其中,WIDTH表示寄存器的位宽,POLY表示生成多项式,INIT表示初始值,XOROUT表示最终异或值。在reset方法中将寄存器初始化为初始值,update方法会根据输入数据逐位计算CRC值,并更新到寄存器中,get_crc方法返回最终计算出的CRC值。
帮我使用sv的function 写一下crc16 ccitt的校验和
我可以给你一个示例:unsigned short crc16_ccitt(unsigned char *data_p, unsigned short length)
{
unsigned char i;
unsigned int data;
unsigned int crc = 0xffff; if (length == 0)
return (~crc); do
{
for (i=0, data=(unsigned int)0xff & *data_p++;
i < 8;
i++, data >>= 1)
{
if ((crc & 0x0001) ^ (data & 0x0001))
crc = (crc >> 1) ^ POLY;
else crc >>= 1;
}
} while (--length); crc = ~crc;
data = crc;
crc = (crc << 8) | (data >> 8 & 0xff); return (crc);
}
阅读全文