function automatic logic [15:0] CalcCrcDAT(input [15:0] crc, input inbit); return {crc[14:0],crc[15]^inbit} ^ {3'b0,crc[15]^inbit,6'b0,crc[15]^inbit,5'b0}; endfunction task cmd_53_wr_dat_gen; input [9:0] num; reg [7:0] wr_data; reg dat_part_select; integer k; reg [15:0] crc [3:0]; begin @(negedge clk); for(int j = 0; j < 4; j++) crc[j] <= 16'd0; @(negedge clk); dat_en <= 1'b1; dat_d <= 4'h0; wr_data<= 8'd1; dat_part_select <= 1'b0; for(int j = 0; j < 4; j++) crc[j] <= CalcCrcDAT(crc[j],1'b0); for (k=0;k<num * 2;k=k+1) begin @(negedge clk); dat_en <= 1'b1; dat_part_select <= ~dat_part_select; if(dat_part_select) begin dat_d <= wr_data[7:4]; for(int j = 0; j < 4; j++) crc[j] <= CalcCrcDAT(crc[j],wr_data[j+4]); end else begin dat_d <= wr_data[3:0]; wr_data <= wr_data + 1'b1; for(int j = 0; j < 4; j++) crc[j] <= CalcCrcDAT(crc[j],wr_data[j+4]); end end @(negedge clk); dat_en <= 1'b1; dat_d <= 4'hf; @(negedge clk); dat_en <= 1'b0; dat_d <= 4'hf; end endtask中为什么crc一直为第一次赋值0
时间: 2024-03-22 19:38:33 浏览: 18
在 task cmd_53_wr_dat_gen 中,开始时对 crc 数组进行了清零操作:
```
for(int j = 0; j < 4; j++)
crc[j] <= 16'd0;
```
因此,每次进入 for 循环之前,crc 数组都被赋值为 0。而在 for 循环中,虽然对 crc 数组进行了更新操作,但是在下一次循环开始时,crc 又被重新赋值为 0。所以,无论循环进行多少次,crc 数组始终为第一次赋值的 0。
相关问题
在system Verilog中function automatic logic [15:0] CalcCrcDAT(input [15:0] crc, input inbit); return {crc[14:0],crc[15]^inbit} ^ {3'b0,crc[15]^inbit,6'b0,crc[15]^inbit,5'b0}; endfunction task cmd_53_wr_dat_gen; input [9:0] num; reg [7:0] wr_data; reg dat_part_select; integer k; reg [15:0] crc [3:0]; begin @(negedge clk); dat_en <= 1'b1; dat_d <= 4'h0; wr_data<= 8'd1; dat_part_select <= 1'b0; for(int j = 0; j < 4; j++) crc[j] <= CalcCrcDAT(crc[j],1'b0); for (k=0;k<num * 2;k=k+1) begin @(negedge clk); dat_en <= 1'b1; dat_part_select <= ~dat_part_select; if(dat_part_select) begin dat_d <= wr_data[7:4]; for(int j = 0; j < 4; j++) crc[j] <= CalcCrcDAT(crc[j],wr_data[j+4]); end else begin dat_d <= wr_data[3:0]; wr_data <= wr_data + 1'b1; for(int j = 0; j < 4; j++) crc[j] <= CalcCrcDAT(crc[j],wr_data[j+4]); end end @(negedge clk); dat_en <= 1'b1; dat_d <= 4'hf; @(negedge clk); dat_en <= 1'b0; dat_d <= 4'hf; end endtask中为什么crc一直为不定态
根据代码,可以看到在task `cmd_53_wr_dat_gen` 中,`crc` 是一个数组,但是在初始化时并没有对其进行赋值。因此,最初 `crc` 数组的值是不确定的。
在代码的循环中,使用了 `CalcCrcDAT` 函数对 `crc` 进行更新,但是由于 `crc` 最初的值不确定,因此在更新时可能会出现错误,导致 `crc` 的值一直是不确定的。
为了解决这个问题,可以在 `cmd_53_wr_dat_gen` 中对 `crc` 数组进行初始化,或者在声明 `crc` 时给定初始值。
system Verilog中 代码reg dat_en = 0; reg [3:0] dat_d ; reg [15:0] crc_cal [3:0]; initial begin for(int j = 0; j < 4; j++) crc_cal[j] <= 16'd0; end function automatic logic [15:0] CalcCrcDAT(input [15:0] crc, input inbit); return {crc[14:0],crc[15]^inbit} ^ {3'b0,crc[15]^inbit,6'b0,crc[15]^inbit,5'b0}; endfunction task cmd_53_wr_dat_gen; input [9:0] num; reg [7:0] wr_data; reg dat_part_select; integer k; begin /* @(negedge clk); for(int j = 0; j < 4; j++) crc_cal[j] <= 16'd0; */ @(negedge clk); dat_en <= 1'b1; dat_d <= 4'h0; wr_data<= 8'd1; dat_part_select <= 1'b0; for(int j = 0; j < 4; j++) crc_cal[j] <= CalcCrcDAT(crc_cal[j],1'b0); for (k=0;k<num * 2;k=k+1) begin @(negedge clk); dat_en <= 1'b1; dat_part_select <= ~dat_part_select; if(dat_part_select) begin dat_d <= wr_data[7:4]; for(int j = 0; j < 4; j++) crc_cal[j] <= CalcCrcDAT(crc_cal[j],wr_data[j+4]); end else begin dat_d <= wr_data[3:0]; wr_data <= wr_data + 1'b1; for(int j = 0; j < 4; j++) crc_cal[j] <= CalcCrcDAT(crc_cal[j],wr_data[j+4]); end end @(negedge clk); dat_en <= 1'b1; dat_d <= 4'hf; @(negedge clk); dat_en <= 1'b0; dat_d <= 4'hf; end endtask中为什么crc一直为为0
在这段代码中,`crc_cal` 是一个数组,并且在初始时,使用了如下代码将其所有元素初始化为 0:
```
initial begin
for(int j = 0; j < 4; j++)
crc_cal[j] <= 16'd0;
end
```
在 `cmd_53_wr_dat_gen` 的循环中,使用了 `CalcCrcDAT` 函数对 `crc_cal` 数组进行更新,因此在每次循环后,`crc_cal` 数组应该会被更新为新的值。
如果 `crc_cal` 数组一直为 0,那么可能是因为在循环中,没有正确调用 `CalcCrcDAT` 函数来更新数组的值。你可以检查一下代码中 `CalcCrcDAT` 函数的实现是否正确,并确保在循环中正确调用了该函数。此外,你也可以在代码中增加一些调试语句,例如打印出 `crc_cal` 数组的值,来帮助你定位问题所在。
阅读全文