如何简化yosys中的复合赋值

时间:2015-11-26 13:55:21

标签: verilog yosys

我正在努力让yosys将我的设计综合到结构verilog,以获得一种工具,该工具无法理解语法{A, B}以指定值AB的连接

例如,当yosys生成类似

的语句时
assign C = {A,B};
assign {D,E} = F;

工具扼流圈。我想过使用splitnets传递消除多位线,但多位端口仍然会导致yosys生成{}语法。即使正在运行splitnets -ports也会留下一些分配内容,例如

assign {A, B} = {C, D}

我终于能够使用opt的额外运行让这些作业消失。但这似乎是消除{}构造的一种非常混乱的方式。

是否有一些更好的方法可以在不拆分所有输入端口的情况下消除此构造?

1 个答案:

答案 0 :(得分:1)

没有普遍适用的方法。 {..}运算符是verilog的一部分,因此verilog后端在适当的时候使用它。

但是,在示例中,您给出了verilog输出中的所有单元都具有单位输入和输出,因此分配单元端口不需要{..}运算符,仅用于为彼此分配电线。 / p>

我已使用以下脚本(在rtl/ directory中执行)作为基线:

read_verilog aes_128.v table.v round.v
hierarchy -top aes_128
proc; flatten; synth
# opt_clean -purge
write_verilog -noattr -noexpr out.v

这将生成一个Verilog文件,其中包含以下使用{..}运算符的赋值:

$ grep '{' out.v
assign \a1.S4_0.in  = { key[23:0], key[31:24] };
assign { \a1.k0a [31:25], \a1.k0a [23:0] } = { key[127:121], key[119:96] };
assign \a1.v0  = { key[127:121], \a1.k0a [24], key[119:96] };

然而,信号a1.S4_0.ina1.k0aa1.v0仅出现在设计中,因为yosys尝试尽可能多地保留原始信号名称,以便更轻松调试设计。

取消注释opt_clean -purge命令会让yosys删除这些信号,从而产生一个不使用{..}运算符的输出文件:

$ grep -c '{' out.v 
0