简体   繁体   English

如何在verilog systemverilog中分配给genvar?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM