Logic Values
Logic Values are the building blocks of logic in Neo. They are similar to a logic or wire in Verilog, but are strongly typed instead of just having a width and have timing information. This timing information is used to ensure soundness of pipelines.
Declaration
Logic values can be declared anywhere in a module, using the following syntax.
logic my_name(0): Bits(32);In this example, a logic value with name my_name will be created with a type of Bits(32) and a timing of 0. By default, timing is relative to a module's default trigger, which is provided to a module when it's instantiated. For more on the timing system, see TODO.
Logic values can also be given a value as part of their declaration:
logic my_name(0): Bits(32) = some_other_value;Assignment
Logic values can be statically assigned with an assign statement:
assign target_value = some_other_value;For complex logic expressions, a comb or seq block is used. This is equivalent to always_comb and always_ff in SystemVerilog. Expressions in logic blocks are allowed to generate more than one assignment. For example, an if expression could assign to two wires in each branch:
comb {
if condition {
a = some_value;
b = some_other_value;
} else {
a = some_other_value;
b = some_value;
}
}In a comb block, it is required that all assignments have the same timing. In a seq block, it is required that all targets have a timing value that is one cycle later than the source.