3

我试图让 yosys 将我的设计合成到结构 verilog 的工具中,该工具不理解 {A, B}指定值AB.

例如,当 yosys 生成如下语句时

assign C = {A,B};
assign {D,E} = F;

工具窒息。我想过用splitnetspass 来消除多位线,但是多位端口仍然会导致 yosys 生成{} 语法。即使跑步也会splitnets -ports留下一些任务,比如

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

我终于能够使用额外的opt. 但这似乎是消除{}构造的一种非常混乱的方式。

有没有更好的方法可以在不拆分所有输入端口的情况下消除这种结构?

4

1 回答 1

1

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

但是,在示例中,您给 verilog 输出中的所有单元格都提供了一位输入和输出,因此{..}分配单元格端口时不需要操作符,仅用于相互分配线路。

我使用以下脚本(在您的rtl/ 目录中执行)作为基线:

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
于 2015-11-27T10:56:07.007 回答