参数中定义的verilog RTL“case”宽度?
我正在使用generate块创建流水线mux: 有没有办法在case语句中参数化case参数中定义的verilog RTL“case”宽度?,case,verilog,parameterized,Case,Verilog,Parameterized,我正在使用generate块创建流水线mux: 有没有办法在case语句中参数化case module muxNto1byW( input clk, input reset, input wire[(SELECT_WIDTH-1):0] select, input wire[(DATA_WIDTH*NUM_IN
module muxNto1byW(
input clk,
input reset,
input wire[(SELECT_WIDTH-1):0] select,
input wire[(DATA_WIDTH*NUM_INPUTS-1):0] din,
output reg[(DATA_WIDTH-1):0] y
);
/* 4 LUT_WIDTH = 6, SEL DATA_INPUTS = 2 */
parameter SELECT_WIDTH = LUT_WIDTH - DATA_INPUTS;
...
generate
/* some for loops */
// register this stage's muxes
reg[(DATA_WIDTH-1):0] pipelineStage;
// assign values to each mux in this stage
always@(posedge reset or posedge clk)
if( reset )
pipelineStage <= {DATA_WIDTH{1'b0}};
else
begin
if( i == 0 ) // Stage 0 evaluates the inputs
case ( select[(SELECT_BITS_PER_STAGE-1):0] )
2'b00 : /* do something */
2'b01 : /* do something different */
2'b10 : /* you get the picture */
2'b11 : /* the last case */
endcase
endgenerate
generate的使用看起来不是很干净,我会将您试图包装的代码转换成一个子模块。然后,generate可以对子模块进行多个实例化,并将它们连接起来。然后,generate可以根据需要在实例上设置参数。这将问题分解为生成,然后再正确缩放模块 如果不同的技术只能实现2对1的多路复用,如何编写此代码 对我来说,这是一个有点令人困惑的说法。您是指根据可用于合成的库更改RTL吗?综合将能够从可用的2到1个多路复用器中实现隐含逻辑,将其中的3个多路复用器组合起来创建一个4到1的多路复用器 RTL应该独立于用于合成的库,其可移植性是一个优势 如果您指的是可以基于参数扩展其功能的RTL,那么我将对select的MSB进行零填充,以使case语句不受影响,但具有无法访问的状态除外
parameter SELECT_BITS_PER_STAGE = 1;
localparam SELECT_MAX_WIDTH = 2;
localparam SELECT_EXTEND_BY = SELECT_MAX_WIDTH-SELECT_BITS_PER_STAGE;
wire select_ext = { {SELECT_EXTEND_BY{1'b0}}, select};
alway @* begin //just putting case statement in valid syntax
//...
case ( select_ext )
2'b00 : /* do something */
2'b01 : /* do something different */
2'b10 : /* you get the picture */
2'b11 : /* the last case */
default : /* catch all when select larger than 2 bits */
endcase
//...
end
注意:如果从case语句中删除width和base,它们将被解释为十进制值,可能是整数width。下面是有效的:我通常不会这样做,但在select的宽度可以根据参数更改的上下文中可能有意义
case ( select_ext )
0 : /* do something */
1 : /* do something different */
2 : /* you get the picture */
3 : /* the last case */
default : /* catch all when select larger than 2 bits */
endcase
请显示更多的代码。目前尚不清楚pipelineStage打算如何在generate for循环中使用。i的数据类型是什么?答案是肯定的。此外,实现这一点的方法不止一种。然而,正如Morgan statet在他的回答中所说,RTL模型应该独立于您的技术库——它是合成工具的功能,用于将抽象RTL描述映射到库单元中。要么不这样做,要么更详细地解释为什么需要此功能。而且,您提供的代码现在看起来毫无意义。
case ( select_ext )
0 : /* do something */
1 : /* do something different */
2 : /* you get the picture */
3 : /* the last case */
default : /* catch all when select larger than 2 bits */
endcase