Verilog 如何简化yosys中的复合赋值
我试图让yosys将我的设计合成一个不理解语法Verilog 如何简化yosys中的复合赋值,verilog,yosys,Verilog,Yosys,我试图让yosys将我的设计合成一个不理解语法{a,B}的工具的结构verilog,以指定值a和B的串联 例如,当yosys生成如下语句时 assign C = {A,B}; assign {D,E} = F; assign {A, B} = {C, D} 工具卡住了。我曾想过使用splitnets过程来消除多位连接,但多位端口仍然会导致yosys生成{}语法。即使运行splitnets-ports也会留下如下分配 assign C = {A,B}; assign {D,E} = F; a
{a,B}
的工具的结构verilog,以指定值a
和B
的串联
例如,当yosys生成如下语句时
assign C = {A,B};
assign {D,E} = F;
assign {A, B} = {C, D}
工具卡住了。我曾想过使用splitnets
过程来消除多位连接,但多位端口仍然会导致yosys生成{}
语法。即使运行splitnets-ports
也会留下如下分配
assign C = {A,B};
assign {D,E} = F;
assign {A, B} = {C, D}
我终于能够通过额外运行opt
使这些任务消失。但这似乎是一种非常混乱的消除{}
结构的方法
有没有更好的方法可以在不拆分所有输入端口的情况下消除这种结构?没有通用的方法可以做到这一点。
{..}
操作符是verilog的一部分,因此verilog后端会在适当的时候使用它
但是,在您给出的示例中,verilog输出中的所有单元都有单位输入和输出,因此分配单元端口时不需要{..}
运算符,只需将导线分配给彼此即可
我使用了以下脚本(在您的中执行)作为基线:
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] };
$ grep -c '{' out.v
0
然而,信号a1.S4_0.in
、a1.k0a
和a1.v0
仅出现在设计中,因为yosys试图保留尽可能多的原始信号名称,以便于调试设计
取消注释opt_clean-purge
命令将允许yosys删除这些信号,生成不使用{..}
运算符的输出文件:
$ 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] };
$ grep -c '{' out.v
0
您是否可以包含演示该问题的完整verilog模块的代码?另外:
{..}
在作业的右侧也有问题吗?read_verilog aes_128.v table.v round.v;压平删除aes_128%n;合成器;写出verilog-noattr-noexpr out.v;现在回想起来,{}可能只是作业左侧的一个问题。但不确定,因为这两种类型总是同时出现。