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 18:39:49 浏览: 16
在这段代码中,`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` 数组的值,来帮助你定位问题所在。
相关问题
reg_data <= {reg_data[14:0], data_in[0]};
这是一个Verilog HDL语言中的代码片段,它用于实现一个16位移位寄存器中的右移操作。其中,reg_data是一个16位的寄存器变量,data_in是一个1位的输入变量。这段代码的作用是将reg_data中的数据从最高位开始向右移动一位,并将data_in的数据放置在最低位上。
具体地,{reg_data[14:0], data_in[0]}表示一个由15位组成的向量,其中15-1位为reg_data的14-0位,0位为data_in的0位。通过将这个向量赋值给reg_data,就实现了右移操作。移位后,原来的最高位数据被丢弃,最低位数据被填充为data_in的值。
需要注意的是,这段代码中的移位方式为逻辑右移,即在最高位填充0。如果需要进行算术右移,则需要在移位后重新设置最高位的值。
assign button_flag_en = (~flag_reg2) & flag_reg1; assign uart_flag = (~recv_done_d1) & recv_done_d0; assign motor_en = (digit == digit_set);
这是一些Verilog的代码片段,它们是用来实现硬件电路的。我可以为你解释这些代码的含义。
第一行代码 `assign button_flag_en = (~flag_reg2) & flag_reg1;` 中,`~`表示取反,`&`表示按位与运算。这行代码的含义是,如果`flag_reg1`的值为1,且`flag_reg2`的值为0,则`button_flag_en`的值为1,否则为0。
第二行代码 `assign uart_flag = (~recv_done_d1) & recv_done_d0;` 中,`~`表示取反,`&`表示按位与运算。这行代码的含义是,如果`recv_done_d0`的值为1,且`recv_done_d1`的值为0,则`uart_flag`的值为1,否则为0。
第三行代码 `assign motor_en = (digit == digit_set);` 中,`==`表示相等运算。这行代码的含义是,如果`digit`的值等于`digit_set`的值,则`motor_en`的值为1,否则为0。
这些代码片段看起来都是用来控制电路中的开关或者状态变量的。