在Always块内生成语句,可能吗?

时间:2019-05-10 12:16:34

标签: verilog

我想了解有关Generate语句的更多信息,我知道您可以复制模块,并且始终可以阻塞(就像在另一篇文章中一样),但是, 这样可以创建参数化的案例吗?

always @ (negedge clk) 
 begin
if (state==1)
  begin
     case(CS_sel)
    begin
        generate
           genvar i;
           for (i=0; i<N_DACS; i=i+1)
         begin: for1
            i:begin
               num <= mod_in[(i+1)*BITS-1:i*BITS];
               div <= mod_out[(i+1)*BITS-1:i*BITS];
            end // i:
             end    // for1
        endgenerate
        default: begin
           num <= mod_in[BITS-1:0];
           div <= mod_out[BITS-1:0];
        end // default
    end  // case (CS_sel)
     endcase // case (CS_sel)
  end // if (state==1)
  end // always

首先,我想知道这是否可行以及我该怎么做

在此之后,如果您知道在verilog中创建同步多路复用器的另一种选择,那就太好了!

谢谢!

1 个答案:

答案 0 :(得分:1)

generate块不能在Always块内使用,而必须放在外面。因此,实际上可以构建多个不同的Always块,并通过generate if构造在它们之间进行选择。

但是,仅通过查看给定的代码,我建议使用另一种方法,即使用适当的切片,并采用固定宽度和灵活偏移量:

if(CS_sel < N_DACS) begin
    num <= mod_in[BITS*CS_sel +:BITS];
    div <= mod_out[BITS*CS_sel +:BITS];
end else begin 
    //default stuff
    num <= mod_in[BITS-1:0];
    div <= mod_out[BITS-1:0];
end

之所以有效,是因为它实际上类似于

wire [BITS-1:0] subset0;

assign subset0 = mod_in >> (BITS*CS_sel);
[...]
num <= subset0[BITS-1:0];

无法直接使用mod_in[(i+1)*BITS-1:i*BITS]之类的东西,因为从理论上讲,这将允许灵活的宽度,而据我所知,(标准)verilog目前尚不支持这种宽度。