用VScode实现verilog模板

介绍如何使用Vscode来快速编辑verilog代码

背景:verilog中很多重复的结构和语句,针对此情况现有的插件代码补全太少了,所以出此文编写自定义代码块,拒绝重复编写同结构的代码,同结构代码自定义代码模板。

1.Vscode安装

  • Vscode官网:https://code.visualstudio.com/
  • 其他Vscode安装教程:https://zhuanlan.zhihu.com/p/44593798

2. IC代码插件推荐:

  • Verilog
  • Verilog Format
  • Verilog HDL
  • Verilog_Testbench
  • Verilog-HDL/SystemVerilog/Bluespec SystemVerilog
  • TCL Language Support
  • Verilog Snippet
  • Makefile Tools
  • Error Lens(其他代码检查报错可以装这个!但还没有探索到检查verilog的)

尽量的都安装吧,反正没多大的坏处。


3.IC的module模板:

主要包含日常新建module、新建if、新建always、新建ifelse等语句的自动补全

如何设置用户代码自动补全内容
然后选择所需要设置的代码类型:我用的是verilog.json(应该是某个插件的配置代码)
选择所需要的代码类型
verilog.json文件内容:

{
	// Place your snippets for verilog here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:

	// always
	"Print to always": {
		"prefix": "always",
		"body": [
			"always@(posedge sys_clk or negedge sys_rst_n) begin",
			"",
			"end",
		],
		"description": "always"
	},
	// if_rstn
	"Print to if_rstn": {
		"prefix": "if",
		"body": [
			"if(!sys_rst_n) begin",
			"",
			"end",
			"else begin",
			"",
			"end",
		],
		"description": "if_rstn"
	},
	// if_rstn_elseif_
	"Print to if_else": {
		"prefix": "if",
		"body": [
			"if(!sys_rst_n) begin",
			"",
			"end",
			"else if() begin",
			"",
			"end",
			"else begin",
			"",
			"end",
		],
		"description": "if_rstn"
	},
	// else
	"Print to else": {
		"prefix": "else",
		"body": [
			"else begin",
			"",
			"end",
		],
		"description": "if_rstn"
	},
	// repeat
	"Print to repeat": {
		"prefix": "repeat",
		"body": [
			"repeat (n) begin",
			"",
			"end",
		],
		"description": "repeat"
	},
	// module
	"Print to module": {
		"prefix": "module",
		"body": [
			"/*----------------------------------------------------------------",
			"****designer: ",
			"****email: ",
			"****date: ",
			"****funtions: ",
			"----------------------------------------------------------------*/",
			" ",
			"`timescale 1ns/1ps",
			"module A  #(",
			"    										//parameter",
			"    parameter CLOCK_FREQ  = 50_000_000	, 		//clock frequency",
			"    parameter DATA_WIDTH  = 8			,       //width of data_width",
			")",
			"(",
			"    										//sys signals",
			"    input      sys_clk      			,       //sys clock",
			"    input      sys_rst_n    			,       //sys rst",
			" ",
			"    										//ctrl signals",
			"    input      _en          			,       //enable signals ",
			"    output     _done        			,       //finish signals ",
			" ",
			"    										//data ",
			"    input      _data_in     			,       //data in",
			"    output     _data_out    			,       //data out",
			");",

			"    localparam  						;",
			" ",
			"    reg         						;",
			" ",
			"    wire        						;",
			" ",
			"    //funtion description",
			"    always@(posedge sys_clk or negedge sys_rst_n) begin",
			"        if(!sys_rst_n) begin",
			"            A <= 'd0 ;",
			"        end",
			"        else begin",
			"            A <= B ;",
			"        end",
			"    end",
			"    assign A <= B? 1'b1:1'b0;",
			" ",
			"    al",
			" ",
			"endmodule",

		],
		"description": "module"
	},
		// module
		"Print to module_tb": {
			"prefix": "module",
			"body": [
				"/*----------------------------------------------------------------",
				"****designer: ",
				"****email: ",
				"****date: ",
				"****funtions: ",
				"----------------------------------------------------------------*/",
				" ",
				"`timescale 1ns/1ps",
				"module A_tb ();",
				"    											//parameter",
				"    parameter CLOCK_FREQ  = 50_000_000;  				//clock frequency",
				"    parameter DATA_WIDTH  = 8;           				//width of data_width",

				"    											//sys signals",
				"    reg      sys_clk_reg      			;          		//sys clock",
				"    reg      sys_rst_n_reg    			;          		//sys rst",
				" ",
				"    											//ctrl signals",
				"    reg      _en_reg          			;          		//enable signals ",
				"    wire     _done        				;          		//finish signals ",
				" ",
				"    											//data ",
				"    reg      _data_in_reg     			;          		//data in",
				"    wire     _data_out    				;              	//data out",
				" ",
				" ",
				"    // reg => inst",
				"    wire sys_clk       = sys_clk_reg;",
				"    wire sys_rst_n     = sys_rst_n_reg;",
				" ",
				"    wire _en           = _en_reg;",
				"    wire _data_in_reg    = enspi_n_reg;",
				" ",
				"    localparam  CLOCK_TIME = 10;",
				" ",
				"    //generate clock and rst",
				"    always #(CLOCK_TIME) sys_clk_reg=~sys_clk_reg;",
				"    initial begin",
				"        sys_clk_reg   = 0;",
				"        sys_rst_n_reg = 0;",
				"        #(4*CLOCK_TIME)",
				"        sys_rst_n_reg = 1;",
				"    end",
				" ",
				"    //generate reg change,",
				"    always #(10*CLOCK_TIME) _en_reg ={$random} % 2;",
				"    initial begin",
				"        _data_in_reg = 'd0;",
				"        #(CLOCK_TIME)",
				"        repeat (20)  begin",
				"            _data_in_reg = 'd0;",
				"            #(CLOCK_TIME)",
				"            _data_in_reg = _data_in_reg + 1'b1; ",
				"        end",
				"    end",
				" ",
				"    // instantiate module",
				"    A *(",
				"        .CLOCK_FREQ(CLOCK_FREQ),",
				"        .DATA_WIDTH(DATA_WIDTH),",
				"    )",
				"    A_inst",
				"    (",
				"        .sys_clk     (sys_clk           ),",
				"        .sys_rst_n   (sys_rst_n_reg     ),",
				"        ._en         (en                ),",
				"        ._done       (done              ),",
				"        ._data_in_reg(_data_in_reg      ),",
				"        ._data_out   (_data_out         ),",
				"     );",
				" ",
				"endmodule",
	
			],
			"description": "module"
		}
}

注意:请尽量代码备注用英文,Poor English 都行,因为verilog这种代码还是采用vcs+verdi来仿真比较好,速度快,而且对任意信号都可以调用信号,vcs+verdi对中文不太友好。另外,对于module模块定义的时候,代码行后写该信号作用,并分接口类型前一行来写该组信号作用。module模块信号尽可能地对齐。哪怕是标点符号,这样可以列选择,例化地时候非常方便!!!!。

另外对于经常写的代码,也可以通过这种方式来自动补全。

在虚拟机中用VCS+Verdi的makefile文件请参考VCS仿真教程(一):Verilog+波形+Makefile

另外还希望每个模块尽可能地在开始写上笔名+联系方式+日期+功能描述(会借助插件生成时序图地尽量插上时序图方便回顾)。

批注:写此博客主要是个人记录学习内容,


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用VSCode编写Verilog,您需要安装Verilog插件。以下是一些步骤: 1. 打开VSCode并在左侧菜单中选择“扩展”。 2. 在搜索栏中输入“Verilog”,然后选择“Verilog HDL”插件并安装。 3. 创建一个新文件并将其保存为“.v”文件扩展名。 4. 在文件中编写Verilog代码。 5. 使用插件提供的语法高亮和代码补全功能来帮助您编写代码。 6. 您可以使用插件提供的调试功能来调试您的Verilog代码。 希望这可以帮助您开始使用VSCode编写Verilog! ### 回答2: 首先,需要安装vscodeverilog插件。在vscode的扩展商店中搜索“Verilog HDL”,安装该插件。 安装完成后,可以打开一个verilog文件,使用插件提供的语法高亮、代码片段和关键字补全等特性来编写verilog代码。 如需运行verilog代码,在vscode中打开终端,并安装相应的verilog仿真工具,如iverilog或ModelSim等。安装完成后,就可以在终端中进行仿真运行,例如: ``` iverilog -o sim hello.v vvp sim ``` 以上命令首先使用iverilog对hello.v进行编译生成可执行文件sim,然后使用vvp运行该可执行文件,进行仿真运行。仿真结果可以在终端中查看,并根据需要调试代码。 此外,vscode还提供了调试器插件,可以针对verilog代码进行调试。安装调试器插件后,可以设置断点、单步运行、查看变量值等操作,方便进行代码调试。 总的来说,使用vscode进行verilog编写需要安装插件、仿真工具和调试器插件等,操作起来略显复杂,但可以提升编写效率和代码质量。 ### 回答3: VS Code是一个非常流行的免费源代码编辑器,可以用于Verilog的编写。以下是如何使用VS Code编写Verilog代码的步骤和建议。 1. 安装VS Code 首先,您需要安装VS Code。您可以从官方网站 https://code.visualstudio.com/download 下载并安装它。安装完成后,您需要安装Verilog的扩展包。 2. 安装Verilog扩展包 要使用VS Code编写Verilog代码,您需要安装Verilog的扩展包。您可以通过按下快捷键Ctrl+Shift+X来打开扩展视图。在搜索框中搜索“Verilog”,选择合适的扩展包进行安装。 3. 创建Verilog项目 在您的VS Code编辑器中创建一个新的文件夹来保存您的Verilog项目。使用Ctrl+Shift+N键为您的项目创建一个新的文件夹。 4. 创建Verilog文件 创建Verilog代码文件。在新文件夹中,右键点击鼠标,在弹出菜单中选择“新建文件”(New File)。保存文件时,请确保使用“*.v”文件扩展名。 5. 编写Verilog代码 现在,您可以开始编写Verilog代码了。在编辑器中输入代码和注释,并保存文件。 6. 使用VS Code的Verilog扩展功能 VS Code的Verilog扩展提供了许多有用的功能,包括: - 高亮语法:使代码更易读 - 自动补全:快速输入代码 - 智能感知:根据上下文提供有关代码的提示 - 代码片段:快速插入常用代码 - 语法检查:表示代码是否有语法错误 - 跳转到定义:跳转到代码定义的位置 - 导航栏:了解代码结构 7. 编译和仿真Verilog代码 您可以使用您选择的Verilog仿真器进行编译和仿真。在终端窗口中,键入仿真命令,编译您的代码并运行仿真。在仿真器中查看仿真时间图。 这就是如何使用VS Code编写Verilog的简单步骤和建议。建议您探索VS Code的其他功能,包括调试和版本控制功能。VS Code是一个非常强大的工具,可以帮助您在更短的时间内更高效地编写Verilog代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值