首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在一个for循环中创建多个generate语句吗?

我可以在一个for循环中创建多个generate语句吗?
EN

Stack Overflow用户
提问于 2022-07-21 14:58:17
回答 2查看 43关注 0票数 0
代码语言:javascript
复制
module test(
    input [15:0] in,
    output [15:0] out);
    
    reg [1:0] Xai_out [7:0];
    reg [1:0] c_accum_in [7:0];
    
    integer i;
    
    initial begin
        i = 10'd0;
    end
    
    always @(*) begin
        c_accum_in[0] = in[1:0];
        c_accum_in[1] = in[3:2];
        c_accum_in[2] = in[5:4];
        c_accum_in[3] = in[7:6];
        c_accum_in[4] = in[9:8];
        c_accum_in[5] = in[11:10];
        c_accum_in[6] = in[13:12];
        c_accum_in[7] = in[15:14];
    end

    genvar c;
    generate
        for(c = 6;c < 8; c= c + 1) begin:b0
            always @(*)
                 Xai_out[i] = c_accum_in[c];
            i = i + 1;
        end

        for(c = 4;c < 6; c= c + 1) begin:b1
            always @(*)
                 Xai_out[i] = c_accum_in[c];
             i = i + 1;
        end

        for(c = 2;c < 4; c= c + 1) begin:b2
            always @(*)
                 Xai_out[i] = c_accum_in[c];
             i = i + 1;
        end

        for(c = 0;c < 2; c= c + 1) begin:b3
            always @(*)
                 Xai_out[i] = c_accum_in[c];
             i = i + 1;
        end
    endgenerate

endmodule

我做了一个轮换代码来改变他们的位置。

每一个接近文本的i = i + 1都有错误(期望“。或"(")。

我不知道这部分的语法错误是什么。

在generate语句中不可能使用i吗?

EN

回答 2

Stack Overflow用户

发布于 2022-07-21 18:49:56

代码中有两个问题:

  1. i是一个动态变量,因此它不能在“生成”块中使用,只有当它是常数时才能操作constants.
  2. even,生成块中不允许像i = i + 1这样的表达式。

为了保持代码的生成性,您需要消除这两种代码。在您的情况下,您可以执行如下操作:

代码语言:javascript
复制
          genvar c;
            generate
                for(c = 6;c < 8; c= c + 1) begin:b0
                    always @(*)
                      Xai_out[c-6] = c_accum_in[c-6];
                 end

                for(c = 4;c < 6; c= c + 1) begin:b1
                    always @(*)
                      Xai_out[3+c-4] = c_accum_in[3+c-4];
                end

                for(c = 2;c < 4; c= c + 1) begin:b2
                    always @(*)
                      Xai_out[5 + c - 2] = c_accum_in[5 + c - 2];
                end

                for(c = 0;c < 2; c= c + 1) begin:b3
                    always @(*)
                      Xai_out[7 + c] = c_accum_in[7 + c];
                end
            endgenerate

它将表达式移动到位下标,但需要您仔细计算。我希望在这件事上我是对的:)

票数 0
EN

Stack Overflow用户

发布于 2022-07-21 18:56:05

不需要生成块。这在3个模拟器中编译时没有警告。

代码语言:javascript
复制
module test(
    input [15:0] in,
    output [15:0] out);
    
    reg [1:0] Xai_out [7:0];
    reg [1:0] c_accum_in [7:0];
    
    integer i;
    
    initial begin
        i = 10'd0;
    end
    
    always @(*) begin
        c_accum_in[0] = in[1:0];
        c_accum_in[1] = in[3:2];
        c_accum_in[2] = in[5:4];
        c_accum_in[3] = in[7:6];
        c_accum_in[4] = in[9:8];
        c_accum_in[5] = in[11:10];
        c_accum_in[6] = in[13:12];
        c_accum_in[7] = in[15:14];
    end

     always @(*) begin :always_block
       //
       int i,j,k,l;
       //
       for(int c = 6;c < 8; c= c + 1) begin:b0
         Xai_out[i] = c_accum_in[c];
         i = i + 1;
       end
         
       for(int c = 4;c < 6; c= c + 1) begin:b1
         Xai_out[j] = c_accum_in[c];
         j = j + 1;
        end
       
       for(int c = 2;c < 4; c= c + 1) begin:b2
          Xai_out[k] = c_accum_in[c];
           k = k + 1;
        end
         
       for(int c = 0;c < 2; c= c + 1) begin:b3
          Xai_out[l] = c_accum_in[c];
          l = l + 1;
        end
      // 
      end:always_block

endmodule
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73068454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档