Python自动生成verilog testbench的端口(port)

0-需要环境

python 3.0 及以上(2.0可能可以)

1-生成程序

1.1-用于转换module port 到 testbench reg and wire

1.1.1-代码

#用于转换module port 到 testbench reg and wire
fir_space = 18
sec_space = 60
f_out = open('tb_reg_wire.txt', 'w+')
with open('module_port.txt', 'r') as f:
    while True:
        line_input = f.readline()
        if not line_input:
            break
        line_tmp = line_input.split();
        if line_tmp[0]=='module':
            line_output = ''
            for i in range(len(line_tmp)):
                line_output += line_tmp[i]
                line_output += ' '
            print(line_output)
            f_out.write('\n'+line_output)
        elif line_tmp[0]=='input':
            line_output = ''
            for i in range(1,len(line_tmp)):
                if len(line_tmp) == 3:
                    if i == 1:
                        line_output += 'reg'
                        line_output += ' '*(sec_space-len(line_output))
                    else:
                        line_output += line_tmp[i]
                elif len(line_tmp) == 4:
                    if i == 1:
                        line_output += 'reg'
                        line_output += ' '*(fir_space-len(line_output))
                    elif i == 2:
                        line_output += line_tmp[i]
                        line_output += ' '*(sec_space-len(line_output))
                    else:
                        line_output += line_tmp[i]
                else:#elif len(line_tmp) == 5
                    if i == 1:
                        line_output += 'reg'
                        line_output += ' '*4
                    elif i == 2:
                        line_output += line_tmp[i]
                        line_output += ' '*(fir_space-len(line_output))
                    elif i == 3:
                        line_output += line_tmp[i]
                        line_output += ' '*(sec_space-len(line_output))
                    else:
                        line_output += line_tmp[i]
            if line_output[len(line_output)-1] == ',':
                line_output =  line_output[:len(line_output)-1] + ';'
            else:
                line_output += ';'
            print(line_output)
            f_out.write('\n'+line_output)
        elif line_tmp[0]=='output':
            line_output = ''
            for i in range(1,len(line_tmp)):
                if len(line_tmp) == 3:
                    if i == 1:
                        line_output += 'wire'
                        line_output += ' '*(sec_space-len(line_output))
                    else:
                        line_output += line_tmp[i]
                elif len(line_tmp) == 4:
                    if i == 1:
                        line_output += 'wire'
                        line_output += ' '*(fir_space-len(line_output))
                    elif i == 2:
                        line_output += line_tmp[i]
                        line_output += ' '*(sec_space-len(line_output))
                    else:
                        line_output += line_tmp[i]
                else:#elif len(line_tmp) == 5
                    if i == 1:
                        line_output += 'wire'
                        line_output += ' '*3
                    elif i == 2:
                        line_output += line_tmp[i]
                        line_output += ' '*(fir_space-len(line_output))
                    elif i == 3:
                        line_output += line_tmp[i]
                        line_output += ' '*(sec_space-len(line_output))
                    else:
                        line_output += line_tmp[i]
            if line_output[len(line_output)-1] == ',':
                line_output =  line_output[:len(line_output)-1] + ';'
            else:
                line_output += ';'
            print(line_output)
            f_out.write('\n'+line_output)
        else:
            line_output = line_tmp[0]
            print(line_output)
            f_out.write('\n'+line_output)
f_out.close()
f.close()

1.1.2-效果演示

输入文本:

module conv_unit(
	input   wire								       			                 clk,
	input   wire						     						             rst_n,
	input   wire                                                                enable,
	input   wire            [`PRECISION*`MAX_KERNEL_NUMBER-1:0]                 din_weight,      
	input   wire            [`PRECISION*`MAX_KERNEL_NUMBER-1:0]                 din_fm,
	input   wire            [`PRECISION-1:0]                                    din_bias,
    input   wire                                                                bias_valid,
    input   wire                                                                fm_updata_valid,
    input   wire                                                                weight_updata_valid,
    input   wire            [`MAX_KERNEL_NUMBER-1:0]                            data_bit_valid,
    input   wire            [`MAX_ACC_BITWIDTH-1:0]                             acc_time,
    input   wire                                                                bias_or_not,
    input   wire            [`MAX_ACC_BITWIDTH-1:0]                             gap_time,
    output  reg                                                                 req_bias,
    output  wire   signed    [`PRECISION-1:0]                                   dout,
    output  reg                                                                 dout_valid
	);

输出文本:

module conv_unit( 
reg                                                         clk;
reg                                                         rst_n;
reg                                                         enable;
reg               [`PRECISION*`MAX_KERNEL_NUMBER-1:0]       din_weight;
reg               [`PRECISION*`MAX_KERNEL_NUMBER-1:0]       din_fm;
reg               [`PRECISION-1:0]                          din_bias;
reg                                                         bias_valid;
reg                                                         fm_updata_valid;
reg                                                         weight_updata_valid;
reg               [`MAX_KERNEL_NUMBER-1:0]                  data_bit_valid;
reg               [`MAX_ACC_BITWIDTH-1:0]                   acc_time;
reg                                                         bias_or_not;
reg               [`MAX_ACC_BITWIDTH-1:0]                   gap_time;
wire                                                        req_bias;
wire   signed     [`PRECISION-1:0]                          dout;
wire                                                        dout_valid;
);

1.2-用于例化端口

1.2.1-代码

#用于例化端口
fir_space = 18
sec_space = 60
f_out = open('tb_port.txt', 'w+')
with open('module_port.txt', 'r') as f:
    while True:
        line_input = f.readline()
        if not line_input:
            break
        line_tmp = line_input.split();
        if line_tmp[0]=='module':
            line_output = line_tmp[len(line_tmp)-1]
            line_output = line_output[:len(line_output)-1]+' '+line_output[:len(line_output)-1]+'_tb('
            print(line_output)
            f_out.write('\n'+line_output)
        elif line_tmp[0]=='input':
            line_output = line_tmp[len(line_tmp)-1]
            if line_output[len(line_output)-1] == ',':
                line_output =  line_output[:len(line_output)-1]
            line_output = '.'+line_output+'('+line_output+')'
            print(line_output)
            f_out.write('\n'+line_output)
        elif line_tmp[0]=='output':
            line_output = line_tmp[len(line_tmp)-1]
            if line_output[len(line_output)-1] == ',':
                line_output =  line_output[:len(line_output)-1]
            line_output = '.'+line_output+'('+line_output+')'
            print(line_output)
            f_out.write('\n'+line_output)
        else:
            line_output = line_tmp[0];
            print(line_output)
            f_out.write('\n'+line_output)
f_out.close()
f.close()

1.2.2-效果演示

输出文本:

conv_unit conv_unit_tb(
.clk(clk)
.rst_n(rst_n)
.enable(enable)
.din_weight(din_weight)
.din_fm(din_fm)
.din_bias(din_bias)
.bias_valid(bias_valid)
.fm_updata_valid(fm_updata_valid)
.weight_updata_valid(weight_updata_valid)
.data_bit_valid(data_bit_valid)
.acc_time(acc_time)
.bias_or_not(bias_or_not)
.gap_time(gap_time)
.req_bias(req_bias)
.dout(dout)
.dout_valid(dout_valid)
);
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于Verilog testbench的问题,我可以给你一些基本的信息。Verilog testbench是用于验证Verilog硬件描述语言编写的电路设计的工具。它是一个模拟环境,用于测试和调试硬件设计的正确性和功能。 Verilog testbench通常由两个主要部分组成:被测设计(DUT)和测试环境。被测设计是你要验证的Verilog电路设计,而测试环境是用于模拟输入信号和检查输出信号的代码。 测试环境包括生成输入信号、应用输入信号到DUT、检查DUT输出信号以及报告测试结果的代码。你可以使用Verilog语言编写测试环境,以确保DUT按预期工作。 以下是一个简单的Verilog testbench示例: ```verilog module DUT(input wire a, input wire b, output wire c); // 这里是你的电路设计 // ... endmodule module testbench; // 生成输入信号 reg a, b; wire c; // 实例化被测设计 DUT dut(a, b, c); // 模拟输入信号 initial begin a = 0; b = 0; #10; // 等待10个时间单位 a = 1; #10; b = 1; #10; $finish; // 结束仿真 end // 检查输出信号 always @(c) begin $display("c = %b", c); end endmodule ``` 在这个示例中,DUT是被测设计模块,testbench是测试环境模块。testbench模块中的initial块生成了一系列的输入信号,并在每个输入信号变化后等待一段时间。always块用于检查输出信号并进行显示。 请注意,这只是一个简单的Verilog testbench示例,实际的测试环境可能更加复杂,具体取决于你的电路设计和测试需求。 希望这个回答能对你有所帮助!如果你有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值