【问题标题】:How to simplify compound assignments in yosys如何在 yosys 中简化复合赋值
【发布时间】:2015-11-27 18:56:07
【问题描述】:

我正试图让 yosys 将我的设计合成到结构 verilog 中,以使用不理解语法 {A, B} 的工具来指定值 AB 的串联。

所以例如当 yosys 生成像这样的语句时

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

工具阻塞。我想过使用splitnets pass 来消除多位线,但是多位端口仍然会导致 yosys 生成{} 语法。即使运行splitnets -ports 也会留下一些任务,例如

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

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

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

【问题讨论】:

  • 你能包含一个完整的verilog模块的代码来演示这个问题吗?另外:作业右侧的{..} 真的也有问题吗?
  • github.com/jeremysalwen/combinatorial_aes read_verilog aes_128.v table.v round.v;变平;删除 aes_128 %n;合成器; write_verilog -noattr -noexpr out.v;现在我想起来了,{} 可能只是分配左侧的问题。不过不确定,因为这两种类型总是一起出现。

标签: verilog yosys


【解决方案1】:

没有普遍适用的方法可以做到这一点。 {..} 运算符是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 2015-11-08
    • 1970-01-01
    • 2020-12-07
    • 2021-04-24
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多