[英]how to assign to genvar in verilog systemverilog?
I need to wire quite a few registers into a register file.我需要将相当多的寄存器连接到一个寄存器文件中。 The registers control a multi-channel receiver so they are repeated for all the Nchan receiver channels.
这些寄存器控制多通道接收器,因此它们对所有 Nchan 接收器通道重复。 Here is the section of code.
这是代码部分。 The error message says: "syntax error near '='".
错误消息说:“'='附近的语法错误”。 This happens on the line "regoffset = 0+Nsys_reg+Nchan*0;"
这发生在“regoffset = 0+Nsys_reg+Nchan*0;”行上and all the other such assignments.
以及所有其他此类任务。
I am trying to use the regoffset genvar to improve readability, etc. How do I modify the value of a genvar inside a generate statement?我正在尝试使用 regoffset genvar 来提高可读性等。如何在 generate 语句中修改 genvar 的值? Is there a better approach?
有没有更好的方法?
// receiver registers
genvar chanvar, regoffset;
// individual channel resets in a single register
generate
regoffset = 0+Nsys_reg+Nchan*0;
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign chan_reset[chanvar] = slv_reg[regoffset][chanvar];
end
assign slv_read[regoffset] = slv_reg[regoffset];
// the start up delay registers, wired sequentially.
regoffset = 1+Nsys_reg+Nchan*0;
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign start_delay[chanvar] = slv_reg[regoffset+chanvar][11:0];
assign slv_read[regoffset+chanvar] = slv_reg[regoffset+chanvar];
end
// the starting doppler registers, wired sequentially.
regoffset = 1+Nsys_reg+Nchan*1;
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign start_dopp[chanvar] = slv_reg[regoffset+chanvar];
assign slv_read[regoffset+chanvar] = slv_reg[regoffset+chanvar];
end
// the SV select registers, wired sequentially.
regoffset = 1+Nsys_reg+Nchan*2;
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign ca_sel[chanvar] = slv_reg[regoffset+chanvar][5:0];
assign slv_read[regoffset+chanvar] = slv_reg[regoffset+chanvar];
end
endgenerate
Use a localparam
instead of a genvar
.使用
localparam
而不是genvar
。
// receiver registers
genvar chanvar;
// individual channel resets in a single register
generate
localparam regoffset0 = 0+Nsys_reg+Nchan*0;
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign chan_reset[chanvar] = slv_reg[regoffset0][chanvar];
end
assign slv_read[regoffset0] = slv_reg[regoffset0];
// the start up delay registers, wired sequentially.
localparam regoffset1 = 1+Nsys_reg+Nchan*0;
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign start_delay[chanvar] = slv_reg[regoffset1+chanvar][11:0];
assign slv_read[regoffset1+chanvar] = slv_reg[regoffset1+chanvar];
end
...
endgenerate
You could also use a function你也可以使用一个函数
function integer regoffset(integer N);
regoffset = 1+N*Nsys_reg+Nchan*N;
endfunction
genvar chanvar;
// individual channel resets in a single register
assign slv_read[regoffset(0)-1] = slv_reg[regoffset(0)-1];
generate
for (chanvar=0; chanvar<Nchan; chanvar++) begin
assign chan_reset[chanvar] = slv_reg[regoffset(0)-1][chanvar];
// the start up delay registers, wired sequentially.
assign start_delay[chanvar] = slv_reg[regoffset(0)+chanvar][11:0];
assign slv_read[regoffset(0)+chanvar] = slv_reg[regoffset(0)+chanvar];
// the starting doppler registers, wired sequentially.
assign start_dopp[chanvar] = slv_reg[regoffset(1)+chanvar];
assign slv_read[regoffset(1)+chanvar] = slv_reg[regoffset(1)+chanvar];
// the SV select registers, wired sequentially.
assign ca_sel[chanvar] = slv_reg[regoffset(2)+chanvar][5:0];
assign slv_read[regoffset(2)+chanvar] = slv_reg[regoffset(2)+chanvar];
end
endgenerate
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.