python的scale方法的变体以及使用_你都用 Python 来做什么?

主要是写点辅助的小工具,以前用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,确实很好用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值