Verilog 是静态的以模仿物理设计。您需要知道可以支持的最大字节数。要知道输入的大小,只需在数据字节移位时使计数器无能。获得动态大小的唯一方法是,如果这是用于不可综合的行为建模,那么您可以使用 C 代码链接到您的设计 (PLI/VPI/DPI) 或 SystemVerilog 队列(IEEE Std 1800-2012 第 7.10 节)。如果您有兴趣,请阅读有关 SystemVerilog 的信息。
下面是一个大移位寄存器的 Verilog 示例:
parameter SIZE = 2**10;
reg [SIZE*8-1:0] store;
always @(posedge clk or negedge rst_n) begin
if ( !rst_n ) begin
counter <= 0;
store <= {(SIZE*8){1'b0}};
end
else if ( push_in ) begin
counter <= first_byte ? 0 : (counter+1);
store <= {store[SIZE*8-1-8:0], data_in[7:0]};
end
end
使用“非常大的寄存器”,您可能需要将其分解store
成块,以便模拟器可以处理它;一些模拟器无法处理reg [2**32-1:0] store;
。须藤代码示例:
// ...
storeN <= {store3[SIZE*8-1-8:0], storeM[7:0]};
// ...
store1 <= {store1[SIZE*8-1-8:0], store0[7:0]};
store0 <= {store0[SIZE*8-1-8:0], data_in[7:0]};
// ...