65 lines
1.6 KiB
Markdown
Raw Normal View History

2025-02-03 09:54:19 -07:00
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.
2025-02-03 09:59:19 -07:00
## Syntax
2025-02-03 09:54:19 -07:00
The general syntax of a module is as follows:
```verilog
module <name> ([port_list]);
// Contents of the module
endmodule
2025-02-03 09:59:19 -07:00
// 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,
2025-02-03 11:19:08 -07:00
input b,
2025-02-03 09:59:19 -07:00
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.
2025-02-03 11:19:08 -07:00
Ports can be declared in the port list, or in the module body. Ports declared in the port list can optionally omit their type, 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;
endmodule
```
2025-02-03 09:59:19 -07:00
### Port types
2025-02-03 10:04:19 -07:00
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.
2025-02-03 11:19:08 -07:00
Ports can be a vector type:
```verilog
module test(a, b, c);
endmodule
```