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
时间: 2024-03-22 14:39:49 浏览: 66
在这段代码中,`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` 数组的值,来帮助你定位问题所在。
相关问题
在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` 时给定初始值。
解释以下代码module enable ( input de_en_out, input rst, output reg io_en1,//对应各个指示位 output reg io_en2, output reg io_en3, output reg io_en4, output reg io_en5, output reg io_en6, output reg en//使能:停止全部记数 ); reg [2:0] state; always @ (negedge de_en_out or negedge rst) begin if(!rst) state <= 3'd0; else if(state==3'd6) state <= 3'd0; else state <= state + 1'b1; end always @ (state) begin case(state) 3'd0: begin io_en1<=0; io_en2<=0; io_en3<=0; io_en4<=0; io_en5<=0; io_en6<=0; en<=0; end 3'd1: begin io_en1<=1; io_en2<=0; io_en3<=0; io_en4<=0; io_en5<=0; io_en6<=0; en<=1; end 3'd2: begin io_en1<=0; io_en2<=1; io_en3<=0; io_en4<=0; io_en5<=0; io_en6<=0; en<=1; end 3'd3: begin io_en1<=0; io_en2<=0; io_en3<=1; io_en4<=0; io_en5<=0; io_en6<=0; en<=1; end 3'd4: begin io_en1<=0; io_en2<=0; io_en3<=0; io_en4<=1; io_en5<=0; io_en6<=0; en<=1; end 3'd5: begin io_en1<=0; io_en2<=0; io_en3<=0; io_en4<=0; io_en5<=1; io_en6<=0; en<=1; end 3'd6: begin io_en1<=0; io_en2<=0; io_en3<=0; io_en4<=0; io_en5<=0; io_en6<=1; en<=1; end default:begin io_en1<=0; io_en2<=0; io_en3<=0; io_en4<=0; io_en5<=0; io_en6<=0; en<=0; end endcase end endmodule
这段代码是一个Verilog HDL语言的模块,它包含了一个状态机和一些输出端口。其中,输入端口有de_en_out和rst,输出端口有io_en1~io_en6和en。这个模块的功能是控制这些输出端口的状态,根据状态机的状态,控制相应的输出端口为高电平或低电平。当rst为低电平时,状态机的状态被设置为0;当de_en_out为低电平时,状态机的状态自动递增1,直到状态机的状态达到6为止。最后,en输出端口被设置为高电平,表示停止全部记数。
阅读全文