使用Yosys查找和替换Verilog中的操作

时间:2016-04-11 18:22:19

标签: yosys

我试图看看Yosys是否符合我的要求。 我想要做的是在Verilog代码中找到一个操作(例如temp = 16 * val1 + 8 * val2)并将其替换为另一个op(temp = val1<<< 4 + val2<<<<<<<<<<< 3)。

我需要学习哪些部分&使用Yosys?如果有人知道要使用的命令集,他/她能让我知道以提高我的学习曲线吗?

感谢。

1 个答案:

答案 0 :(得分:0)

例如,考虑以下verilog输入(test.v):

module test(input [7:0] val1, val2, output [7:0] temp);
  assign temp = 16*val1 + 8*val2;
endmodule

命令yosys -p 'prep; opt -full; show' test.v将产生以下电路图:

enter image description here

写入控制台的输出包含:

3.1. Executing OPT_EXPR pass (perform const folding).
Replacing multiply-by-16 cell `$mul$test.v:2$1' in module `\test' with shift-by-4.
Replacing multiply-by-8 cell `$mul$test.v:2$2' in module `\test' with shift-by-3.
Replacing $shl cell `$mul$test.v:2$1' (B=3'100, SHR=-4) in module `test' with fixed wiring: { \val1 [3:0] 4'0000 }
Replacing $shl cell `$mul$test.v:2$2' (B=2'11, SHR=-3) in module `test' with fixed wiring: { \val2 [4:0] 3'000 }

阅读Replacing multiply-by-* cell的两行是您提到的转换。之后的两行使用{val1[3:0], 4'b0000}{val2[4:0], 3'b000}作为加法器的输入,用布线替换恒定的移位操作。

这是在opt_expr通行证中完成的。请参阅passes/opt/opt_expr.cc了解其源代码,了解其完成情况。