Vivado中带变量起始点的数组+:切片语法可综合性及异常咨询
问题解答
1. +: 语法的正确性
vector[starting_point +: output_length] 是完全合法且可综合的Verilog语法,属于Verilog-2001标准引入的部分选择索引(Part-Select Indexing),专门用于处理「起始索引为变量、选择宽度固定」的向量片段提取需求。与之对应的-:语法,则用于从起始索引往低位方向提取固定宽度的片段。你的代码中这个语法的使用是正确的。
2. 综合结果异常的原因
你遇到的现象不是Vivado的bug,而是综合器的资源推断策略导致的:
- 你的代码里,
vector被描述为串行移位寄存器(always_ff块实现左移,din从最低位补入)。Vivado综合器会优先将这类结构推断为Xilinx专属的SRL(移位寄存器LUT)原语(这里是SRL16,其16位容量足够容纳你的11位移位寄存器),以此节省触发器资源。 - SRL原语本身只有一个输出端口,只能从移位寄存器的某个抽头输出单一比特。综合器误将你的
vector[start_ptr +:4]理解为「从SRL的某个起始抽头连续取4个输出」,但SRL无法同时输出多个抽头,因此只能输出其中一个比特,其余三位被综合器默认置0。
3. 解决方法
要得到你预期的「每个输出位对应一个多路选择器」的结构,需要引导综合器将移位寄存器实现为普通触发器阵列,而非SRL:
- 在
vector的声明上添加综合属性,阻止SRL推断:
这个属性会告诉综合器,不要把该寄存器提取为移位寄存器LUT,而是用普通触发器实现。这样每个寄存器位都是独立的FF,后续的(* shreg_extract = "no" *) logic[10:0] vector = 0;+:部分选择就会被综合为4个独立的多路选择器,每个输出位对应一个MUX,从不同的FF输出中选择对应位置的信号。
内容的提问来源于stack exchange,提问作者dadduni
相关产品推荐
相关产品推荐

