如何在 yosys 中简化复合赋值

How to simplify compound assignments in yosys

我正在尝试让 yosys 将我的设计综合为结构 verilog 的工具,该工具不理解语法 {A, B} 来指定值 AB 的串联.

因此,例如当 yosys 生成类似

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

工具卡住了。我想过使用 splitnets 传递来消除多位线,但多位端口仍然导致 yosys 生成 {} 语法。即使 运行ning splitnets -ports 也会留下一些作业,例如

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

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

有没有更好的方法来消除这个构造而不拆分所有输入端口?

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

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

我使用以下脚本(在您的 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