86 lines
2.0 KiB
Markdown
86 lines
2.0 KiB
Markdown
Modules are the building block through which Verilog is built.
|
|
|
|
Each module can be thought of as a black box with a series of inputs, and a series of outputs. Changing the input changes the outputs.
|
|
|
|
Module definitions are started with the `module` keyword, and closed with the `endmodule` keyword.
|
|
|
|
## Syntax
|
|
The general syntax of a module is as follows:
|
|
```verilog
|
|
module <name> ([port_list]);
|
|
// Contents of the module
|
|
endmodule
|
|
|
|
// The port list is optional
|
|
module <name>;
|
|
// Contents
|
|
endmodule
|
|
```
|
|
|
|
Below is an example of the structure of a half adder module:
|
|
```verilog
|
|
module half_adder(
|
|
input a,
|
|
input b,
|
|
output sum_bit,
|
|
output carry_bit
|
|
);
|
|
// ------- snip ------------
|
|
endmodule
|
|
```
|
|
|
|
## Ports
|
|
Ports are a set of signals that act as input and outputs for a particular module.
|
|
|
|
There are 3 kinds of ports:
|
|
- `input`: Input ports can only receive values from the outside. `input` ports cannot be written to.
|
|
- `output`: Output ports can be written to, but not read from.
|
|
- `inout`: Inout ports can send *and* receive values.
|
|
|
|
Ports can be declared in the port list, or in the module body. Ports declared in the port list can optionally omit their type and only declare a name, to be specified within the body of the module:
|
|
```verilog
|
|
module half_adder(
|
|
a,
|
|
b,
|
|
sum_bit,
|
|
carry_bit
|
|
);
|
|
input a;
|
|
input b;
|
|
output sum_bit;
|
|
output carry_bit;
|
|
// ----------- snip -----------
|
|
endmodule
|
|
```
|
|
|
|
The full type of a port can also be defined within the portlist:
|
|
```verilog
|
|
```verilog
|
|
module half_adder(
|
|
input wire a,
|
|
input wire b,
|
|
output wire sum_bit,
|
|
output wire carry_bit
|
|
);
|
|
input a;
|
|
input b;
|
|
output sum_bit;
|
|
output carry_bit;
|
|
// ----------- snip -----------
|
|
endmodule
|
|
```
|
|
|
|
### Port types
|
|
If no type is defined, ports are implicitly defined as *nets* of type `wire`.
|
|
|
|
> In verilog, the term *net* refers to network, and it refers to a connection that joins two or more devices together.
|
|
|
|
Ports can be a vector type:
|
|
```verilog
|
|
module test(a, b, c);
|
|
input [7:0] a;
|
|
input [7:0] b;
|
|
output [7:0] c;
|
|
// -------- snip ---------
|
|
endmodule
|
|
``` |