主要是写点辅助的小工具,以前用Perl和Tcl,换成Python之后明显感觉好用很多。
本人基本不会用C、C++语言,和软件相关的语言,似乎只会Perl、Tcl、Python。作为码农,主要的代码是Verilog HDL,对应的平台是可编程逻辑器件FPGA,懂的应该知道,这个是必须到一些EDA工具的。
由于EDA工具的限制,我所了解的同行大部分还是用Tcl和Perl。使用Python的确实不太多。不过目前项目的框架是Python实现的,所以在自学一段时间的Python后,就每天使用。
工作上的Python不多说了,来说说自己用Python写的一些辅助工具。
一、设计层级
以前用ISE和Vivado工具,工程加入代码后的显示是这样的
可以在不运行Elaborate或者Synthesize时就显示层级。这样方便知道当前工程里面有哪些子模块。
年初的项目开始用Altera(Intel)的芯片,Quartus Prime Pro这个工具,在运行Elaborate或者Synthesize前是不会显示层级的。但是如果没有添加所有的设计模块文件,Elaborate和Synthesize这两步会报错的。
这在不熟悉工程的时候,是多么的闹心,要一个文件一个文件去看还有哪些子模块。
那就用Python写个小工具吧。
先看Vivado和ISE效果
Python的效果
确实界面是丑了一点,而且无法识别出一些底层的原语,也会被识别为子模块,不过简单用用是够了
简单一点可以只看子模块的名字,不看实例名字,这样重复的子模块调用只会出现一次
这样的设计
对于这样的小工具,Python很快就能写出来,还是很方便的。
另外一个小需求就是格式优化
有时候会拿到一些写的比较乱的代码,比如
`timescale 1ns / 1ps
//*********************Entity Declaration*******************************
module gtwizard_0_GT_USRCLK_SOURCE
(output
GT0_TXUSRCLK_OUT,
output GT0_TXUSRCLK2_OUT,
input GT0_TXOUTCLK_IN,
output GT0_RXUSRCLK_OUT ,
output
GT0_RXUSRCLK2_OUT,
input
wire
Q0_CLK1_GTREFCLK_PAD_N_IN,
input wire
Q0_CLK1_GTREFCLK_PAD_P_IN,
output wire
Q0_CLK1_GTREFCLK_OUT);
`define DLY #1
//****************Wire Declarations**********************************
wire tied_to_ground_i;
wire tied_to_vcc_i;
wire gt0_txoutclk_i;
wire q0_clk1_gtrefclk;
wire gt0_txusrclk_i;
//********************** Beginning of Code *******************************
// Static signal Assigments
assign tied_to_ground_i = 1'b0;
assign tied_to_vcc_i = 1'b1;
assign gt0_txoutclk_i = GT0_TXOUTCLK_IN;
assign Q0_CLK1_GTREFCLK_OUT = q0_clk1_gtrefclk;
//IBUFDS_GTE2
IBUFDS_GTE2
ibufds_instQ0_CLK1
(
.O (q0_clk1_gtrefclk),
.ODIV2 (),
.CEB (tied_to_ground_i),
.I (Q0_CLK1_GTREFCLK_PAD_P_IN),
.IB (Q0_CLK1_GTREFCLK_PAD_N_IN));
// Instantiate a MMCM module to divide the reference clock. Uses internal feedback
// for improved jitter performance, and to avoid consuming an additional BUFG
BUFG
txoutclk_bufg0_i
(
.I (gt0_txoutclk_i),
.O (gt0_txusrclk_i));
assign GT0_TXUSRCLK_OUT =
gt0_txusrclk_i;
assign GT0_TXUSRCLK2_OUT
= gt0_txusrclk_i;
assign GT0_RXUSRCLK_OUT
= gt0_txusrclk_i;
assign GT0_RXUSRCLK2_OUT
= gt0_txusrclk_i;
endmodule
下面是格式调整后的结果
`timescale 1ns / 1ps
module gtwizard_0_GT_USRCLK_SOURCE (
output GT0_TXUSRCLK_OUT,
output GT0_TXUSRCLK2_OUT,
input GT0_TXOUTCLK_IN,
output GT0_RXUSRCLK_OUT,
output GT0_RXUSRCLK2_OUT,
input wire Q0_CLK1_GTREFCLK_PAD_N_IN,
input wire Q0_CLK1_GTREFCLK_PAD_P_IN,
output wire Q0_CLK1_GTREFCLK_OUT
);
`define DLY #1
wire tied_to_ground_i;
wire tied_to_vcc_i;
wire gt0_txoutclk_i;
wire q0_clk1_gtrefclk;
wire gt0_txusrclk_i;
assign tied_to_ground_i = 1'b0;
assign tied_to_vcc_i = 1'b1;
assign gt0_txoutclk_i = GT0_TXOUTCLK_IN;
assign Q0_CLK1_GTREFCLK_OUT = q0_clk1_gtrefclk;
IBUFDS_GTE2 ibufds_instQ0_CLK1 (
.O(q0_clk1_gtrefclk),
.ODIV2(),
.CEB(tied_to_ground_i),
.I(Q0_CLK1_GTREFCLK_PAD_P_IN),
.IB(Q0_CLK1_GTREFCLK_PAD_N_IN)
);
BUFG txoutclk_bufg0_i (
.I(gt0_txoutclk_i),
.O(gt0_txusrclk_i)
);
assign GT0_TXUSRCLK_OUT = gt0_txusrclk_i;
assign GT0_TXUSRCLK2_OUT = gt0_txusrclk_i;
assign GT0_RXUSRCLK_OUT = gt0_txusrclk_i;
assign GT0_RXUSRCLK2_OUT = gt0_txusrclk_i;
endmodule
确实整齐了一些。缺点是会丢失注释。一般来说,我会用这个工具来调整一下格式,然后将需要的部分复制到自己的代码中。不过这个需求却是越来越少,主要是自己的代码有积累的话,遇到很难看的格式的概率就比较低。
上述两个小功能,之前也用Tcl和Perl来尝试实现过,但最终都没有彻底完成。前段时间用Python彻底重写,发现确实方便很多,大大提高了代码效率。对于一个不怎么会写软件的人来说,能有这样的效果,已经很满意了。
另外,其实这个设计的主要功能不是这两个。是还有一些更复杂的需求,这两个功能只是一个设计中顺带的产物。
Python,确实很好用