转载请注明出处:

 【更新完善】利用python自动生成verilog模块例化模板 - 没落骑士 - 博客园
https://www.cnblogs.com/moluoqishi/p/11332152.html

一、前言

  之前写过一篇关于利用Python生成module instance的文章,现直接在这篇文章基础上修改完善。作为一名IC验证工程师在公司经常写些脚本,自己在这方面的功底也提高了不少,再者有网友评论之前的脚本有不足之处,所以本文编写了一个进阶版的脚本,扩展性也比较强,方便大家使用。

二、代码设计

  新添加的功能特性包括:

  1 支持inout端口

  2 支持多module文件中指定module的instance生成(不指定则默认与文件名一致)

  3 检查注释行

  4 生成Instance同时提供端口参数注释,包括端口方向和位宽

  5 可选同时生成端口连接信号及其声明

  因为提供了上述特性,代码逻辑较基础版更为复杂点。整个生成过程分为三个阶段:获得指定module的代码段,从中提取出端口信息以及按照指定工作模式生成instance文件。先上代码再加以说明:

基础版:

  1. #!/usr/bin/python
  2.  
  3. import re
  4. import os
  5.  
  6. #regex compile
  7. regex_module = re.compile('(module)(\s+)(\w+)')
  8.  
  9. regex_ports = re.compile('''
  10. (input|output) #0
  11. (\s+) #1
  12. (wire|reg\s+)? #2
  13. (\[\w+\-1\:0\]\s+)? #3
  14. (\w+) #4
  15. ''',re.VERBOSE)
  16.  
  17. directory = os.getcwd()
  18. #open the design file
  19. file_design = input('Please enter the file name:')
  20. with open(directory+'/'+file_design,'r') as file_obj:
  21. comment = file_obj.read()
  22.  
  23. #regex match module name
  24. module_obj = regex_module.search(comment)
  25. print(module_obj.group())
  26. #regex match ports name
  27. groups_ports = regex_ports.findall(comment)
  28. print('\nnumber of ports:',len(groups_ports))
  29.  
  30. #write the instantiation templete to an assigned file
  31. file_tb = input('Please enter the top file name:')
  32. with open(directory+'/'+file_tb,'a') as file_obj2:
  33. if module_obj is not None:
  34. file_obj2.write(module_obj.group(3)+' uut\n(\n')
  35.  
  36. num = len(groups_ports)
  37. for i in range(num):
  38. if i == num-1:
  39. file_obj2.write('.'+groups_ports[i][4]+' ()\n')
  40. else:
  41. file_obj2.write('.'+groups_ports[i][4]+' (),\n')
  42. file_obj2.write(');\n')

python_inst.py

进阶版:

  1. import re
  2. import argparse
  3. import os
  4.  
  5. class Rtl_generator:
  6. def __init__(self):
  7. self.extract_list=[]
  8. self.info_list=[]
  9. self.module_name = None
  10.  
  11. @staticmethod
  12. def display_list_for_test(list_name):
  13. print('list :\n')
  14. for unit in list_name:
  15. print(unit)
  16.  
  17. def get_module_specified_lines(self,regex,file_name):
  18. print('input function: get_module_specified\n')
  19. with open(file_name,'r') as file_obj:
  20. add_flag = 0
  21. for line in file_obj:
  22. line = line.strip()
  23. if not line.startswith('//'):
  24. re_head_obj = re.match(regex,line)
  25. re_tail_obj = re.match(r'endmodule',line)
  26. if re_head_obj is not None:
  27. add_flag = 1
  28. elif add_flag == 1 and re_tail_obj is not None:
  29. add_flag = 0
  30. break
  31. else:
  32. continue
  33.  
  34. if add_flag == 1:
  35. self.extract_list.append(line)
  36.  
  37. def extract_ports_info(self,regex_ports, regex_width):
  38. print('input function: get_ports_info\n')
  39. for unit in self.extract_list:
  40. re_ports_obj = re.search(regex_ports,unit)
  41. if re_ports_obj is not None:
  42. port_name = re_ports_obj.group(6)
  43. port_direction = re_ports_obj.group(1)
  44. port_width_str = re_ports_obj.group(4)
  45. if port_width_str is None:
  46. port_width = 1
  47. else:
  48. #port_width = port_width_str
  49. width_str = re.search(regex_width,port_width_str).group(2)
  50. width_info_list = width_str.split(":")
  51. high_str = width_info_list[0]
  52. low_str = width_info_list[1]
  53. if '-1' in high_str:
  54. port_width = high_str.split("-")[0]
  55. else:
  56. high = int(high_str)
  57. low = int(low_str)
  58. port_width = high - low + 1 if high >= low else low - high + 1
  59. port_info = {'name':port_name,'direct':port_direction,'width':port_width}
  60. self.info_list.append(port_info)
  61.  
  62. def gen_module_instance(self,filename,mode):
  63. print('input function: gen_module_instance')
  64. ports_num = len(self.info_list)
  65. line_list = []
  66. line_list.append('module wrapper();')
  67. if mode == 'gen_inst_wc':
  68. for i in range(ports_num):
  69. var_type = 'reg' if self.info_list[i]['direct'] == 'input' else 'wire'
  70. line_list.append('{:<5} [{}-1:0] {};'.format(var_type,
  71. self.info_list[i]['width'],
  72. self.info_list[i]['name']))
  73. line_list.append('\n')
  74. line_list.append('{} inst_name'.format(self.module_name))
  75. line_list.append('(')
  76. index = 0
  77.  
  78. for unit in self.info_list:
  79. if index == ports_num - 1:
  80. post_fix = '//{:<15}width:{}'.format(unit['direct'], unit['width'])
  81. else:
  82. post_fix = ',//{:<15}width:{}'.format(unit['direct'], unit['width'])
  83. index+=1
  84.  
  85. if mode == 'gen_inst_wc':
  86. line_list.append('.{:<30}{:<30}{}'.format(unit['name'], '('+unit['name']+')', post_fix))
  87. elif mode == 'gen_inst_only':
  88. line_list.append('.{:<30}{:<5}{}'.format(unit['name'], '(' + ')', post_fix))
  89. line_list.append(');')
  90. line_list.append('endmodule\n')
  91. with open(filename,'w') as file_obj:
  92. for line in line_list:
  93. file_obj.write(line)
  94. file_obj.write('\n')
  95. print('generate instance finish')

rtl_generator.py

  1. from rtl_generator import *
  2. #import rtl_generator
  3.  
  4. mode_list = ['gen_inst_only','gen_inst_wc']
  5.  
  6. def create_arg_parser():
  7. parser = argparse.ArgumentParser()
  8. parser.add_argument("-filename",required=True)
  9. parser.add_argument("-target",default='wrapper.v')
  10. parser.add_argument("-modulename")
  11. parser.add_argument("-mode",choices=mode_list,default=mode_list[0])
  12.  
  13. options = parser.parse_args()
  14. return options
  15.  
  16. def get_arg(options,option):
  17. if hasattr(options,option):
  18. arg = getattr(options,option)
  19. return arg
  20. else:
  21. return None
  22.  
  23. def compile_regex(**key_args):
  24. regex_dict={}
  25. if 'module_head' in key_args.keys():
  26. regex_module_head = re.compile(r'''
  27. (module\s+)
  28. (%s)
  29. ''' %(key_args['module_head']),re.VERBOSE)
  30. regex_dict['module_head'] = regex_module_head
  31.  
  32. if 'module_ports' in key_args.keys():
  33. regex_module_ports = re.compile(r'''
  34. (output|input|inout) #1 direction
  35. (\s+) #2
  36. (wire|reg)? #3
  37. (\[[\w\-\:]+\])? #4 width
  38. (\s+)? #5
  39. (\w+) #6 port name
  40. ''',re.VERBOSE)
  41. regex_dict['module_ports'] = regex_module_ports
  42.  
  43. if 'width' in key_args.keys():
  44. regex_width = re.compile(r'''
  45. (\[)
  46. ([\w\-\:]+)
  47. (\])
  48. ''',re.VERBOSE)
  49. regex_dict['width'] = regex_width
  50.  
  51. return regex_dict
  52.  
  53. rg = Rtl_generator()
  54.  
  55. if __name__ == "__main__":
  56. options = create_arg_parser()
  57. #print(options)
  58. file_name_arg = get_arg(options,"filename")
  59. module_name_arg=get_arg(options,"modulename")
  60. work_mode_arg = get_arg(options,"mode")
  61. target_file_arg = get_arg(options,"target")
  62.  
  63. (filepath,filename_we) = os.path.split(file_name_arg)
  64. (filename,ext) = os.path.splitext(filename_we)
  65.  
  66. rg.module_name = filename if module_name_arg is None else module_name_arg
  67. print('file name:{}\t\tmodule name:{}'.format(filename_we,rg.module_name))
  68.  
  69. regex_dict = compile_regex(module_head=rg.module_name,module_ports=True,width=True)
  70. rg.get_module_specified_lines(regex_dict['module_head'],file_name_arg)
  71. #rg.display_list_for_test(rg.extract_list)
  72.  
  73. rg.extract_ports_info(regex_dict['module_ports'],regex_dict['width'])
  74. #rg.display_list_for_test(rg.info_list)
  75.  
  76. rg.gen_module_instance(target_file_arg,work_mode_arg)

inst_gen_app.py

  在进阶版的脚本中采用了OOP特性,将相关的数据结构和function封装为Rtl_generator class。把命令行选项参数提取和正则表达式部分放在了inst_gen_app.py中完成。

  根据生成逻辑中的三个阶段详细阐述内部原理:获取指定module代码段过程中,首先检测是否为注释行,若是则利用continue跳过,为有效行才进一步分析。利用add_flag指示是否检测到module头,若检测到则将代码行添加在extract_list里直至遇到endmodule停止。从module代码段中提取端口信息,使用regex_ports的各个group分离出端口名称、位宽以及方向部分字符串。其中位宽部分再次使用regex_width以及运算得到真实的位宽数值,很简单一看就懂不再赘述了。之后以字典的形式存储在info_list中。最后是生成Instance的部分,判断工作模式,若是默认的gen_inst_only则只产生Instance,若是gen_inst_wc,也就是generate instance with connections,那么在instance的端口上添加同名的连接信号以及该信号的声明,有木有太方便!

三、运行结果

 最后我们来看下运行结果,这次在WINDOW的Pycharm环境下开发的,terminal和LINUX中的命令行用起来一样:

> python inst_gen_app.py -filename video_system_wrapper.v -mode gen_inst_wc  -target testbench.sv

  设计原文件与生成文件如下:

  1. //Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
  2. //--------------------------------------------------------------------------------
  3. //Tool Version: Vivado v.2017.4 (win64) Build 2086221 Fri Dec 15 20:55:39 MST 2017
  4. //Date : Sun Mar 22 12:40:33 2020
  5. //Host : DESKTOP-CE32R3P running 64-bit major release (build 9200)
  6. //Command : generate_target video_system_wrapper.bd
  7. //Design : video_system_wrapper
  8. //Purpose : IP block netlist
  9. //--------------------------------------------------------------------------------
  10. `timescale ps / ps
  11.  
  12. module video_system_wrapper
  13. (aclk_0,
  14. aresetn_0,
  15. camera_rstn,
  16. din_0,
  17. en_capture_0,
  18. href_0,
  19. locked_0,
  20. m_axis_video_0_tdata,
  21. m_axis_video_0_tlast,
  22. m_axis_video_0_tready,
  23. m_axis_video_0_tuser,
  24. m_axis_video_0_tvalid,
  25. overflow_0,
  26. pclk_0,
  27. s_axis_video_0_tdata,
  28. s_axis_video_0_tlast,
  29. s_axis_video_0_tready,
  30. s_axis_video_0_tuser,
  31. s_axis_video_0_tvalid,
  32. status_0,
  33. underflow_0,
  34. vga_clk,
  35. vid_io_out_0_active_video,
  36. vid_io_out_0_data,
  37. vid_io_out_0_field,
  38. vid_io_out_0_hblank,
  39. vid_io_out_0_hsync,
  40. vid_io_out_0_vblank,
  41. vid_io_out_0_vsync,
  42. vid_io_out_reset_0,
  43. vsync_0,
  44. vtc_ctrl_araddr,
  45. vtc_ctrl_arready,
  46. vtc_ctrl_arvalid,
  47. vtc_ctrl_awaddr,
  48. vtc_ctrl_awready,
  49. vtc_ctrl_awvalid,
  50. vtc_ctrl_bready,
  51. vtc_ctrl_bresp,
  52. vtc_ctrl_bvalid,
  53. vtc_ctrl_rdata,
  54. vtc_ctrl_rready,
  55. vtc_ctrl_rresp,
  56. vtc_ctrl_rvalid,
  57. vtc_ctrl_wdata,
  58. vtc_ctrl_wready,
  59. vtc_ctrl_wstrb,
  60. vtc_ctrl_wvalid);
  61. input aclk_0;
  62. input aresetn_0;
  63. output camera_rstn;
  64. input [:]din_0;
  65. input en_capture_0;
  66. input href_0;
  67. output locked_0;
  68. output [:]m_axis_video_0_tdata;
  69. output m_axis_video_0_tlast;
  70. input m_axis_video_0_tready;
  71. output m_axis_video_0_tuser;
  72. output m_axis_video_0_tvalid;
  73. output overflow_0;
  74. input pclk_0;
  75. input [:]s_axis_video_0_tdata;
  76. input s_axis_video_0_tlast;
  77. output s_axis_video_0_tready;
  78. input s_axis_video_0_tuser;
  79. input s_axis_video_0_tvalid;
  80. output [:]status_0;
  81. output underflow_0;
  82. input vga_clk;
  83. output vid_io_out_0_active_video;
  84. output [:]vid_io_out_0_data;
  85. output vid_io_out_0_field;
  86. output vid_io_out_0_hblank;
  87. output vid_io_out_0_hsync;
  88. output vid_io_out_0_vblank;
  89. output vid_io_out_0_vsync;
  90. input vid_io_out_reset_0;
  91. input vsync_0;
  92. input [:]vtc_ctrl_araddr;
  93. output vtc_ctrl_arready;
  94. input vtc_ctrl_arvalid;
  95. input [:]vtc_ctrl_awaddr;
  96. output vtc_ctrl_awready;
  97. input vtc_ctrl_awvalid;
  98. input vtc_ctrl_bready;
  99. output [:]vtc_ctrl_bresp;
  100. output vtc_ctrl_bvalid;
  101. output [:]vtc_ctrl_rdata;
  102. input vtc_ctrl_rready;
  103. output [:]vtc_ctrl_rresp;
  104. output vtc_ctrl_rvalid;
  105. input [:]vtc_ctrl_wdata;
  106. output vtc_ctrl_wready;
  107. input [:]vtc_ctrl_wstrb;
  108. input vtc_ctrl_wvalid;
  109.  
  110. wire aclk_0;
  111. wire aresetn_0;
  112. wire camera_rstn;
  113. wire [:]din_0;
  114. wire en_capture_0;
  115. wire href_0;
  116. wire locked_0;
  117. wire [:]m_axis_video_0_tdata;
  118. wire m_axis_video_0_tlast;
  119. wire m_axis_video_0_tready;
  120. wire m_axis_video_0_tuser;
  121. wire m_axis_video_0_tvalid;
  122. wire overflow_0;
  123. wire pclk_0;
  124. wire [:]s_axis_video_0_tdata;
  125. wire s_axis_video_0_tlast;
  126. wire s_axis_video_0_tready;
  127. wire s_axis_video_0_tuser;
  128. wire s_axis_video_0_tvalid;
  129. wire [:]status_0;
  130. wire underflow_0;
  131. wire vga_clk;
  132. wire vid_io_out_0_active_video;
  133. wire [:]vid_io_out_0_data;
  134. wire vid_io_out_0_field;
  135. wire vid_io_out_0_hblank;
  136. wire vid_io_out_0_hsync;
  137. wire vid_io_out_0_vblank;
  138. wire vid_io_out_0_vsync;
  139. wire vid_io_out_reset_0;
  140. wire vsync_0;
  141. wire [:]vtc_ctrl_araddr;
  142. wire vtc_ctrl_arready;
  143. wire vtc_ctrl_arvalid;
  144. wire [:]vtc_ctrl_awaddr;
  145. wire vtc_ctrl_awready;
  146. wire vtc_ctrl_awvalid;
  147. wire vtc_ctrl_bready;
  148. wire [:]vtc_ctrl_bresp;
  149. wire vtc_ctrl_bvalid;
  150. wire [:]vtc_ctrl_rdata;
  151. wire vtc_ctrl_rready;
  152. wire [:]vtc_ctrl_rresp;
  153. wire vtc_ctrl_rvalid;
  154. wire [:]vtc_ctrl_wdata;
  155. wire vtc_ctrl_wready;
  156. wire [:]vtc_ctrl_wstrb;
  157. wire vtc_ctrl_wvalid;
  158.  
  159. video_system video_system_i
  160. (.aclk_0(aclk_0),
  161. .aresetn_0(aresetn_0),
  162. .camera_rstn(camera_rstn),
  163. .din_0(din_0),
  164. .en_capture_0(en_capture_0),
  165. .href_0(href_0),
  166. .locked_0(locked_0),
  167. .m_axis_video_0_tdata(m_axis_video_0_tdata),
  168. .m_axis_video_0_tlast(m_axis_video_0_tlast),
  169. .m_axis_video_0_tready(m_axis_video_0_tready),
  170. .m_axis_video_0_tuser(m_axis_video_0_tuser),
  171. .m_axis_video_0_tvalid(m_axis_video_0_tvalid),
  172. .overflow_0(overflow_0),
  173. .pclk_0(pclk_0),
  174. .s_axis_video_0_tdata(s_axis_video_0_tdata),
  175. .s_axis_video_0_tlast(s_axis_video_0_tlast),
  176. .s_axis_video_0_tready(s_axis_video_0_tready),
  177. .s_axis_video_0_tuser(s_axis_video_0_tuser),
  178. .s_axis_video_0_tvalid(s_axis_video_0_tvalid),
  179. .status_0(status_0),
  180. .underflow_0(underflow_0),
  181. .vga_clk(vga_clk),
  182. .vid_io_out_0_active_video(vid_io_out_0_active_video),
  183. .vid_io_out_0_data(vid_io_out_0_data),
  184. .vid_io_out_0_field(vid_io_out_0_field),
  185. .vid_io_out_0_hblank(vid_io_out_0_hblank),
  186. .vid_io_out_0_hsync(vid_io_out_0_hsync),
  187. .vid_io_out_0_vblank(vid_io_out_0_vblank),
  188. .vid_io_out_0_vsync(vid_io_out_0_vsync),
  189. .vid_io_out_reset_0(vid_io_out_reset_0),
  190. .vsync_0(vsync_0),
  191. .vtc_ctrl_araddr(vtc_ctrl_araddr),
  192. .vtc_ctrl_arready(vtc_ctrl_arready),
  193. .vtc_ctrl_arvalid(vtc_ctrl_arvalid),
  194. .vtc_ctrl_awaddr(vtc_ctrl_awaddr),
  195. .vtc_ctrl_awready(vtc_ctrl_awready),
  196. .vtc_ctrl_awvalid(vtc_ctrl_awvalid),
  197. .vtc_ctrl_bready(vtc_ctrl_bready),
  198. .vtc_ctrl_bresp(vtc_ctrl_bresp),
  199. .vtc_ctrl_bvalid(vtc_ctrl_bvalid),
  200. .vtc_ctrl_rdata(vtc_ctrl_rdata),
  201. .vtc_ctrl_rready(vtc_ctrl_rready),
  202. .vtc_ctrl_rresp(vtc_ctrl_rresp),
  203. .vtc_ctrl_rvalid(vtc_ctrl_rvalid),
  204. .vtc_ctrl_wdata(vtc_ctrl_wdata),
  205. .vtc_ctrl_wready(vtc_ctrl_wready),
  206. .vtc_ctrl_wstrb(vtc_ctrl_wstrb),
  207. .vtc_ctrl_wvalid(vtc_ctrl_wvalid));
  208. endmodule

video_system_wrapper.v

  1. module wrapper();
  2. reg [-:] aclk_0;
  3. reg [-:] aresetn_0;
  4. wire [-:] camera_rstn;
  5. reg [-:] din_0;
  6. reg [-:] en_capture_0;
  7. reg [-:] href_0;
  8. wire [-:] locked_0;
  9. wire [-:] m_axis_video_0_tdata;
  10. wire [-:] m_axis_video_0_tlast;
  11. reg [-:] m_axis_video_0_tready;
  12. wire [-:] m_axis_video_0_tuser;
  13. wire [-:] m_axis_video_0_tvalid;
  14. wire [-:] overflow_0;
  15. reg [-:] pclk_0;
  16. reg [-:] s_axis_video_0_tdata;
  17. reg [-:] s_axis_video_0_tlast;
  18. wire [-:] s_axis_video_0_tready;
  19. reg [-:] s_axis_video_0_tuser;
  20. reg [-:] s_axis_video_0_tvalid;
  21. wire [-:] status_0;
  22. wire [-:] underflow_0;
  23. reg [-:] vga_clk;
  24. wire [-:] vid_io_out_0_active_video;
  25. wire [-:] vid_io_out_0_data;
  26. wire [-:] vid_io_out_0_field;
  27. wire [-:] vid_io_out_0_hblank;
  28. wire [-:] vid_io_out_0_hsync;
  29. wire [-:] vid_io_out_0_vblank;
  30. wire [-:] vid_io_out_0_vsync;
  31. reg [-:] vid_io_out_reset_0;
  32. reg [-:] vsync_0;
  33. reg [-:] vtc_ctrl_araddr;
  34. wire [-:] vtc_ctrl_arready;
  35. reg [-:] vtc_ctrl_arvalid;
  36. reg [-:] vtc_ctrl_awaddr;
  37. wire [-:] vtc_ctrl_awready;
  38. reg [-:] vtc_ctrl_awvalid;
  39. reg [-:] vtc_ctrl_bready;
  40. wire [-:] vtc_ctrl_bresp;
  41. wire [-:] vtc_ctrl_bvalid;
  42. wire [-:] vtc_ctrl_rdata;
  43. reg [-:] vtc_ctrl_rready;
  44. wire [-:] vtc_ctrl_rresp;
  45. wire [-:] vtc_ctrl_rvalid;
  46. reg [-:] vtc_ctrl_wdata;
  47. wire [-:] vtc_ctrl_wready;
  48. reg [-:] vtc_ctrl_wstrb;
  49. reg [-:] vtc_ctrl_wvalid;
  50.  
  51. video_system_wrapper inst_name
  52. (
  53. .aclk_0 (aclk_0) ,//input width:1
  54. .aresetn_0 (aresetn_0) ,//input width:1
  55. .camera_rstn (camera_rstn) ,//output width:1
  56. .din_0 (din_0) ,//input width:8
  57. .en_capture_0 (en_capture_0) ,//input width:1
  58. .href_0 (href_0) ,//input width:1
  59. .locked_0 (locked_0) ,//output width:1
  60. .m_axis_video_0_tdata (m_axis_video_0_tdata) ,//output width:24
  61. .m_axis_video_0_tlast (m_axis_video_0_tlast) ,//output width:1
  62. .m_axis_video_0_tready (m_axis_video_0_tready) ,//input width:1
  63. .m_axis_video_0_tuser (m_axis_video_0_tuser) ,//output width:1
  64. .m_axis_video_0_tvalid (m_axis_video_0_tvalid) ,//output width:1
  65. .overflow_0 (overflow_0) ,//output width:1
  66. .pclk_0 (pclk_0) ,//input width:1
  67. .s_axis_video_0_tdata (s_axis_video_0_tdata) ,//input width:24
  68. .s_axis_video_0_tlast (s_axis_video_0_tlast) ,//input width:1
  69. .s_axis_video_0_tready (s_axis_video_0_tready) ,//output width:1
  70. .s_axis_video_0_tuser (s_axis_video_0_tuser) ,//input width:1
  71. .s_axis_video_0_tvalid (s_axis_video_0_tvalid) ,//input width:1
  72. .status_0 (status_0) ,//output width:32
  73. .underflow_0 (underflow_0) ,//output width:1
  74. .vga_clk (vga_clk) ,//input width:1
  75. .vid_io_out_0_active_video (vid_io_out_0_active_video) ,//output width:1
  76. .vid_io_out_0_data (vid_io_out_0_data) ,//output width:24
  77. .vid_io_out_0_field (vid_io_out_0_field) ,//output width:1
  78. .vid_io_out_0_hblank (vid_io_out_0_hblank) ,//output width:1
  79. .vid_io_out_0_hsync (vid_io_out_0_hsync) ,//output width:1
  80. .vid_io_out_0_vblank (vid_io_out_0_vblank) ,//output width:1
  81. .vid_io_out_0_vsync (vid_io_out_0_vsync) ,//output width:1
  82. .vid_io_out_reset_0 (vid_io_out_reset_0) ,//input width:1
  83. .vsync_0 (vsync_0) ,//input width:1
  84. .vtc_ctrl_araddr (vtc_ctrl_araddr) ,//input width:9
  85. .vtc_ctrl_arready (vtc_ctrl_arready) ,//output width:1
  86. .vtc_ctrl_arvalid (vtc_ctrl_arvalid) ,//input width:1
  87. .vtc_ctrl_awaddr (vtc_ctrl_awaddr) ,//input width:9
  88. .vtc_ctrl_awready (vtc_ctrl_awready) ,//output width:1
  89. .vtc_ctrl_awvalid (vtc_ctrl_awvalid) ,//input width:1
  90. .vtc_ctrl_bready (vtc_ctrl_bready) ,//input width:1
  91. .vtc_ctrl_bresp (vtc_ctrl_bresp) ,//output width:2
  92. .vtc_ctrl_bvalid (vtc_ctrl_bvalid) ,//output width:1
  93. .vtc_ctrl_rdata (vtc_ctrl_rdata) ,//output width:32
  94. .vtc_ctrl_rready (vtc_ctrl_rready) ,//input width:1
  95. .vtc_ctrl_rresp (vtc_ctrl_rresp) ,//output width:2
  96. .vtc_ctrl_rvalid (vtc_ctrl_rvalid) ,//output width:1
  97. .vtc_ctrl_wdata (vtc_ctrl_wdata) ,//input width:32
  98. .vtc_ctrl_wready (vtc_ctrl_wready) ,//output width:1
  99. .vtc_ctrl_wstrb (vtc_ctrl_wstrb) ,//input width:4
  100. .vtc_ctrl_wvalid (vtc_ctrl_wvalid) //input width:1
  101. );
  102. endmodule

testbench.sv

  总结下Usage:

-filename module所在文件的文件名

-modulename 指定要产生instance的module名称(可选项,默认与文件同名)

-mode  工作模式,包括gen_inst_only和gen_inst_wc(可选项,默认为gen_inst_only)

-target 指定生成文件的文件名(可选项,默认为wrapper.v)

  测试还不太充分,若有问题后续会在这篇文章基础上继续改进。下面会传到GITHUB上方便更新!

利用python自动生成verilog模块例化模板的更多相关文章

  1. 利用Python自动生成暴力破解的字典

    Python是一款非常强大的语言.用于测试时它非常有效,因此Python越来越受到欢迎. 因此,在此次教程中我将聊一聊如何在Python中生成字典,并将它用于任何你想要的用途. 前提要求 1,Pyth ...

  2. python笔记 利用python 自动生成条形码 二维码

    1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...

  3. Python自动生成代码工具

    项目中有一个需求,对一个基类而言,拥有一个比较方法和拷贝方法,某些地方需要频繁地对这两个方法进行调用.对于所有子类而言,需要重写这两个方法,并在其中维护类内一些成员变量.例如有一个变量m_iMyVal ...

  4. 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用

    在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...

  5. Verilog与VHDL的混合模块例化

    1,大小写与转义 对VHDL解释器而言,对于模块名和端口名, (1) 若有转义 a) 先不考虑转义,寻找与字符串完全相同的VHDL模块: 若找不到: b) 考虑转义,寻找对应的Verilog模块. ( ...

  6. 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像

    前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP.CV.物联网.无人机等多个领域都发挥了非常重要的作用.最近几年,各种深度学习算法层出不穷, Generative Adverarial Ne ...

  7. 从用python自动生成.h的头文件集合和类声明集合到用python读写文件

    最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...

  8. [06] 利用mybatis-generator自动生成代码

    1.mybatis-generator 概述 MyBatis官方提供了逆向工程 mybatis-generator,可以针对数据库表自动生成MyBatis执行所需要的代码(如Mapper.java.M ...

  9. 利用Python 脚本生成 .h5 文件 代码

    利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...

随机推荐

  1. Codeforces Gym100543L:Outer space invaders(区间DP)

    题目链接 题意 有n个人,每个人有一个出现时间a和一个开枪时间b和一个距离d,在任意一个时刻,你可以选择炸人,你要炸一个人的花费是和他的距离d,并且所有的已经出现并且还没开枪的和你距离<=d的人 ...

  2. curl请求的get.post.put.delete对接其他系统接口方法

    class HttpCurl{ //控客云平台的appid private $appId = xxxxxx; //控客云平台的appkey private $appKey = 'xxxxxxxxxxx ...

  3. kuangbin专题 专题一 简单搜索 Fliptile POJ - 3279

    题目链接:https://vjudge.net/problem/POJ-3279 题意:格子有两面,1表示黑色格子,0表示白色格子,奶牛每次可以踩一个格子,踩到的格子和它周围的上下左右格子都会翻面,也 ...

  4. JDBC连接mysql数据库操作

    一.创建所需对象,并进行初始化 Connection connection=null; Statement statement=null; PreparedStatement pst; ResultS ...

  5. 2. python Mac 安装 dlib

    在macOS上: 从Mac App Store安装 XCode(或安装XCode命令行工具)(最低版本是:xcode8 以上) 有 homebrew 安装 有 CMAKE 安装 基础包 :numpy ...

  6. spark 源码分析之十五 -- Spark内存管理剖析

    本篇文章主要剖析Spark的内存管理体系. 在上篇文章 spark 源码分析之十四 -- broadcast 是如何实现的?中对存储相关的内容没有做过多的剖析,下面计划先剖析Spark的内存机制,进而 ...

  7. IQueryable.Where中动态生成多个并或筛选Expression<Func<T, bool>>

    直接上图

  8. python之unittest框架实现接口测试实例

    python之unittest框架实现接口测试实例 接口测试的方法有很多种,具体到工具有postman,jmeter,fiddler等,但是工具的局限性是测试数据的组织较差,接口的返回工具的判断有限, ...

  9. 个人永久性免费-Excel催化剂功能第21波-Excel与Sqlserver零门槛交互-执行SQL语句篇

    在前两波中,已完成了Excel与Sqlserver的查询和上传功能,但难免许多临时的或更深入地操作数据库需要用Sql语句来操作,对一般用户电脑里,不可能有条件轻易安装一个数据库客户端软件,就算安装了对 ...

  10. 【干货干货】hyperledger fabric 之动态添加组织/修改配置 (Fabric-java-sdk) 下

    我们接着上一节来讲: 在熟悉动态增加组织或修改配置的步骤后,我们就可以使用java的api来完成动态增加组织或修改配置了: 废话不多说,直接上干货: 1,预制条件 org3的证书以及组织3的MSP详情 ...