我想了解有关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中创建同步多路复用器的另一种选择,那就太好了!
谢谢!
答案 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目前尚不支持这种宽度。