我试图看看Yosys是否符合我的要求。 我想要做的是在Verilog代码中找到一个操作(例如temp = 16 * val1 + 8 * val2)并将其替换为另一个op(temp = val1<<< 4 + val2<<<<<<<<<<< 3)。
我需要学习哪些部分&使用Yosys?如果有人知道要使用的命令集,他/她能让我知道以提高我的学习曲线吗?
感谢。
答案 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
将产生以下电路图:
写入控制台的输出包含:
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
了解其源代码,了解其完成情况。