1. Verilog中的module对应C++中的class。它们都可以实例化。例如可以写一个FullAdder module,表示全加器这种器件。
module FullAdder(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
assign {cout, sum} = a + b + cin;
endmodule
然后在执行8-bit补码加减运算的ALU module中实例化8个FullAdder,表示ALU用到了8个FullAdder。
module ALU(a, b, result, cout, is_add);
input[7:0] a, b;
input is_add;
output[7:0] result;
output cout;
wire[7:0] b_not = ~b;
wire[7:0] b_in = is_add ? b : b_not;
wire[7:0] carry;
assign carry[0] = is_add ? 1'b0 : 1'b1;
// module 实例化
// 8-bit ripple adder
FullAdder fa0(a[0], b_in[0], carry[0], result[0], carry[1]);
FullAdder fa1(a[1], b_in[1], carry[1], result[1], carry[2]);
FullAdder fa2(a[2], b_in[2], carry[2], result[2], carry[3]);
FullAdder fa3(a[3], b_in[3], carry[3], result[3], carry[4]);
FullAdder fa4(a[4], b_in[4], carry[4], result[4], carry[5]);
FullAdder fa5(a[5], b_in[5], carry[5], result[5], carry[6]);
FullAdder fa6(a[6], b_in[6], carry[6], result[6], carry[7]);
FullAdder fa7(a[7], b_in[7], carry[7], result[7], cout);
endmodule
对应在C++中先写FullAdder class,然后在ALU class中以FullAdder作为data member。
class FullAdder
{
};
class ALU
{
FullAdder fa[8];
};
另外一点,moudle声明port的方式,像是从早期C语言的函数定义中学来的:
char* strcpy(dst, src)
char* dst;
char* src;
{
// ...
}
另外一点,moudle声明port的方式,像是从早期C语言的函数定义中学来的:
char* strcpy(dst, src)
char* dst;
char* src;
{
// ...
}
2. Verilog中的模块调用时,指定端口可以使用名称绑定。C++在调用函数时,参数只能按顺序书写。例如memset()的原型是:
void *memset(void *s, int c, size_t n);
如果你想将某个buf清零,应该这么写:
char buf[256];
memset(buf, 0, sizeof(buf));
但是如果你不小心写成了:
memset(buf, sizeof(buf), 0);
编译器不会报错,但运行的实际效果是根本没有对
buf
清零。(记得
Richard Stevens
的书里提到过这一点。)
在Verilog中,如果要写一个测试ALU的module,那么其中对ALU实例化的指令可以这么写:
module alu_test;
reg[8:0] a_in, b_in;
reg op_in;
wire[7:0] result_out;
wire carry_out;
ALU alu0(.a(a_in[7:0]), .b(b_in[7:0]), .is_add(op_in),
.result(result_out), .cout(carry_out));
// ...
endmodule
这样就比较容易检查接线错误。
另外,在C++中,如果所有参数类型不同,而且之间没有隐式类型转换,那么可以利用C++的强类型机制在编译期检查出这种调用错误。
3. Verilog中把大括弧{}用作bit的并置,因此语句块要用begin/end标示。Verilog中小括号()和中括号[]的作用与C++中类似,前者用于函数或模块调用,后者用于下标索引。我想如果Verilog把尖括号<>用作bit并置的话,就能把大括号{}解放出来,用作标示语句块,这样写起来更舒服一些。
4. Verilog本质上是测试驱动开发的。对于每个module都应该有对应的test bench(或称test fixture)。比较好的情况是,一个工程师写module,另一个工程师写对应的test bench,这样很容易检查出对电路功能需求理解不一致的地方。因此还可以说Verilog主张结对编程(pair programming)。例如对前面的ALU module的test bench可以写成:
`timescale 1ns / 1ns
module alu_test;
reg[8:0] a_in, b_in;
reg op_in;
wire[7:0] result_out;
wire carry_out;
ALU alu0(.a(a_in[7:0]), .b(b_in[7:0]), .is_add(op_in),
.result(result_out), .cout(carry_out));
reg[9:0] get, expected;
reg has_error;
initial begin
has_error = 1'b0;
op_in = 1'b1; // test addition
for (a_in = 9'b0; a_in != 256; a_in = a_in + 1)
for (b_in = 9'b0; b_in != 256; b_in = b_in + 1) begin
#1;
get = {carry_out, result_out};
expected = a_in + b_in;
if (get !== expected) begin
$display("a_in = %d, b_in = %d, expected %d, get %d",
a_in, b_in, expected, get);
has_error = 1'b1;
end
end
op_in = 1'b0; // test subtraction
// ...
if (has_error === 1'b0) begin
$display("ALL TESTS PASSED!");
end
$finish;
end
endmodule
5. Verilog比起VHDL的不足之处在于,它只能定义concrete class,不能定义abstract class。也就是说interface和implementation不能分离。这在设计大型电路时就显得表现力不足。不过这关系不大,因为可以在编译时选择同一模块的不同实现版本,间接实现了接口与实现的分离。
在VHDL中,强制将接口与实现分离。对每个模块,你都得先写接口(定义输入输出信号),即ENTITY;然后至少写一份实现,即ARCHITECTURE。每个ENTITY可以有不止一份实现,例如可以有行为描述的,也有数据流描述的。然后在配置文件中选择该ENTITY到底用哪一份实现。举例来说(选自《VHDL入门·解惑·经典实例·经验总结》一书),分频器模块可以这么写,先定义其接口FreqDevider,然后定义两份实现Behavior和Dataflow:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.All;
ENTITY FreqDevider IS
PORT
( Clock : IN Std_Logic;
Clkout : OUT Std_Logic
);
END;
ARCHITECTURE Behavior OF FreqDevider IS
SIGNAL Clk : Std_Logic;
BEGIN
PROCESS (Clock)
BEGIN
IF rising_edge(Clock) THEN
Clk <= NOT Clk;
END IF;
END PROCESS;
Clkout <= Clk;
END;
ARCHITECTURE Dataflow OF FreqDevider IS
-- signal declarations
BEGIN
-- processes
END;
在C++中,既可以写concrete class,也可以写abstract class。比Verilog和VHDL都方便。
6. Verilog和VHDL都有模板的概念,Verilog称为参数(parameter),VHDL称为类属(generic)。不过好像都只能用整数作为模板参数,不能像C++那样用类型作为模板参数。
7. 目前来看,Verilog是硬件描述语言,不是硬件设计语言。在用Verilog设计电路的时候,我们是把脑子中想好的电路用Verilog“描述”出来:哪里是寄存器、哪里是组合逻辑、数据通路是怎样、流水线如何运作等等都要在脑子里有清晰的映象。然后用RTL代码写出来,经过综合器综合出的电路与大脑中的设想相比八九不离十。这就像说C语言是可移植的汇编语言,以前好的C程序员在写代码的时候,能够知道每条语句背后对应的汇编代码是什么。
分享到:
相关推荐
在IT领域,编程语言如C++和硬件描述语言如Verilog是两个重要的工具,分别用于软件和硬件设计。本文将探讨如何使用这两种语言实现几种基本的排序算法:冒泡排序、选择排序,以及两种全比较排序(并行和串行)。 首先...
3. 可能还有测试脚本或测试用例,用于验证Verilog和C++实现的正确性,比如`test_aes.v`和`test_aes.cpp`。 4. Makefile,用于编译和链接C++代码,以及综合和仿真Verilog代码。 5. 测试数据和预期结果,用于比较实际...
资源内容:基于带AXI4接口的SDRAM控制器的Verilog与C++仿真(完整代码+说明文档+数据).rar 代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 适用对象:工科生、数学专业、算法等方向学习者。 ...
Verilog是硬件描述语言(HDL)的一种,用于编写FPGA的设计代码,而C和C++则常用于与FPGA进行软件交互或在嵌入式系统中作为控制层语言。本文将主要围绕FPGA的实战经验、Verilog编程规范以及这些技术的关联应用展开...
使用 Verilog、SystemVerilog、VHDL、SystemC、HLS(C++、OpenCL) 此存储库的想法是在 Verilog、SystemVerilog、VHDL、SystemC、HLS(C++、OpenCL) 中构建各种抽象级别的硬件模型:逻辑、RTL、TLM 和行为/算法。...
北大的Veirlog课件(HDL语言,Verilog 词汇约定,Verilog中的高级结构,Verilog操作符,Verilog数据类型及逻辑系统,Verilog的可综合描述风格,存储器建模,行为建模)和清华微电子所verilog课件和《设计与验证...
system verilog与verilog的区别,也讲了开发时的注意事项
Verilog HDL是一种文本形式的语言,它允许设计者用类似于C或C++的语法来描述数字逻辑系统。它不仅支持数据流和行为建模,还支持结构化设计,使得电路描述更直观、易读。 **2. Verilog基本语法** Verilog包含模块、...
3. **C++**:虽然项目主要使用Verilog,但“C++”标签可能意味着项目中包含了一个软件部分,可能是用于测试、控制或与FPGA交互的接口。C++是一种面向对象的编程语言,通常用于系统级编程和嵌入式应用,因此可能是...
在深入探讨Verilog与SystemVerilog编程陷阱以及如何避免这些常犯的编码错误之前,我们先来了解一下Verilog与SystemVerilog的基本概念。 Verilog是一种硬件描述语言(HDL),主要用于电子系统的设计和验证,包括从...
标题 "c-to-verilog_code_papers" 涉及的核心技术是将C语言代码转换为Verilog硬件描述语言(HDL)代码的过程。这个过程通常称为C到Verilog的综合,它在系统级设计和硬件加速应用中具有重要意义。下面我们将深入探讨...
"VHDL/FPGA/Verilog_C++_"标签暗示了这个项目涵盖了硬件描述语言(VHDL和Verilog)以及高级编程语言(C++)的应用。 VHDL和Verilog是两种硬件描述语言,用于在FPGA上编写逻辑设计。它们允许工程师用接近自然语言的...
Verilog+python+c++实现基于FPGA的数字识别之实时视频处理的定点卷积神经网络实现+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ Verilog+python+c++实现...
标题中的“20110126113917873.rar”可能是一个日期时间戳,表示该压缩文件创建的时间,而“VHDL/FPGA/Verilog_C++_Builder_”则表明内容与使用VHDL、Verilog以及C++在FPGA(Field-Programmable Gate Array)开发中的...
- **案例二:结合硬件描述语言进行协同验证**:探讨如何将C++与硬件描述语言(如Verilog或VHDL)相结合,实现更高效的协同验证策略。 综上所述,《Hardware Verification with C++: A Practitioner’s Handbook》...
Verilog PLI,全称是Verilog Programming Language Interface,是一种接口技术,允许Verilog HDL(硬件描述语言)与外部的C或C++程序进行交互。这个接口使得系统级设计可以利用软件编程的强大功能,例如复杂的算法...
标题"linkrev.rar_VHDL/FPGA/Verilog_C++_"表明这是一个与FPGA相关的设计项目,其中可能包含了VHDL、Verilog和C++三种技术的综合应用。这个项目的核心目标是实现“link传输”,即建立一种数据传输链路,使得TS201...
8. **C和C++源码结合**:在高级设计中,有时会使用C或C++来描述算法,然后通过硬件描述语言接口(如SystemC)与Verilog进行协同仿真,提高设计效率。 9. **实例分析**:书中提供的C和C++源码,可以作为参考,帮助...
Verilog Source Code Formatter -- iStyle 1.20 The C++ source code can be compile by gcc on linux and win32. Used from the command line: Usage : iStyle [options] OriginalSourceFile [...] example: ...
标题中的"zedboard.rar_VHDL/FPGA/Verilog_C++_Builder_"表明这是一个与FPGA开发相关的资源包,特别提到了ZedBoard,一种基于Xilinx Zynq系列的开发板,它集成了FPGA和处理器系统(PS)。这个压缩包可能包含了使用...