diff --git a/techlibs/common/simlib.v b/techlibs/common/simlib.v index 7dc03da6d..5bbad34f6 100644 --- a/techlibs/common/simlib.v +++ b/techlibs/common/simlib.v @@ -371,6 +371,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $shl (A, B, Y) +//- +//- A logical shift-left operation. This corresponds to the Verilog '<<' operator. +//- module \$shl (A, B, Y); parameter A_SIGNED = 0; @@ -395,6 +401,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $shr (A, B, Y) +//- +//- A logical shift-right operation. This corresponds to the Verilog '>>' operator. +//- module \$shr (A, B, Y); parameter A_SIGNED = 0; @@ -419,6 +431,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $sshl (A, B, Y) +//- +//- An arithmatic shift-left operation. +//- This corresponds to the Verilog '<<<' operator. +//- module \$sshl (A, B, Y); parameter A_SIGNED = 0; @@ -443,6 +462,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $sshr (A, B, Y) +//- +//- An arithmatic shift-right operation. +//- This corresponds to the Verilog '>>>' operator. +//- module \$sshr (A, B, Y); parameter A_SIGNED = 0; @@ -639,6 +665,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $lt (A, B, Y) +//- +//- A less-than comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '<' operator. +//- module \$lt (A, B, Y); parameter A_SIGNED = 0; @@ -663,6 +696,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $le (A, B, Y) +//- +//- A less-than-or-equal-to comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '<=' operator. +//- module \$le (A, B, Y); parameter A_SIGNED = 0; @@ -687,6 +727,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $eq (A, B, Y) +//- +//- An equality comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '==' operator. +//- module \$eq (A, B, Y); parameter A_SIGNED = 0; @@ -711,6 +758,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $ne (A, B, Y) +//- +//- An inequality comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '!=' operator. +//- module \$ne (A, B, Y); parameter A_SIGNED = 0; @@ -735,6 +789,15 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $eqx (A, B, Y) +//- +//- An exact equality comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '===' operator. +//- Unlike equality comparison that can give 'x' as output, +//- an exact equality comparison will strictly give '0' or '1' as output. +//- module \$eqx (A, B, Y); parameter A_SIGNED = 0; @@ -759,6 +822,15 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $nex (A, B, Y) +//- +//- An exact inequality comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '!==' operator. +//- Unlike inequality comparison that can give 'x' as output, +//- an exact inequality comparison will strictly give '0' or '1' as output. +//- module \$nex (A, B, Y); parameter A_SIGNED = 0; @@ -783,6 +855,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $ge (A, B, Y) +//- +//- A greater-than-or-equal-to comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '>=' operator. +//- module \$ge (A, B, Y); parameter A_SIGNED = 0; @@ -807,6 +886,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $gt (A, B, Y) +//- +//- A greater-than comparison between inputs 'A' and 'B'. +//- This corresponds to the Verilog '>' operator. +//- module \$gt (A, B, Y); parameter A_SIGNED = 0; @@ -831,6 +917,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $add (A, B, Y) +//- +//- Addition of inputs 'A' and 'B'. This corresponds to the Verilog '+' operator. +//- module \$add (A, B, Y); parameter A_SIGNED = 0; @@ -855,6 +947,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $sub (A, B, Y) +//- +//- Subtraction between inputs 'A' and 'B'. +//- This corresponds to the Verilog '-' operator. +//- module \$sub (A, B, Y); parameter A_SIGNED = 0; @@ -879,6 +978,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $mul (A, B, Y) +//- +//- Multiplication of inputs 'A' and 'B'. +//- This corresponds to the Verilog '*' operator. +//- module \$mul (A, B, Y); parameter A_SIGNED = 0; @@ -1191,6 +1297,14 @@ endgenerate endmodule // -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $pow (A, B, Y) +//- +//- Exponentiation of an input (Y = A ** B). +//- This corresponds to the Verilog '**' operator. +//- `ifndef SIMLIB_NOPOW module \$pow (A, B, Y); @@ -1222,6 +1336,12 @@ endmodule `endif // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $logic_not (A, Y) +//- +//- A logical inverter. This corresponds to the Verilog unary prefix '!' operator. +//- module \$logic_not (A, Y); parameter A_SIGNED = 0; @@ -1243,6 +1363,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $logic_and (A, B, Y) +//- +//- A logical AND. This corresponds to the Verilog '&&' operator. +//- module \$logic_and (A, B, Y); parameter A_SIGNED = 0; @@ -1267,6 +1393,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $logic_or (A, B, Y) +//- +//- A logical OR. This corresponds to the Verilog '||' operator. +//- module \$logic_or (A, B, Y); parameter A_SIGNED = 0; @@ -1306,6 +1438,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $concat (A, B, Y) +//- +//- Concatenation of inputs into a single output ( Y = {B, A} ). +//- module \$concat (A, B, Y); parameter A_WIDTH = 0; @@ -1321,6 +1459,12 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $mux (A, B, S, Y) +//- +//- Multiplexer i.e selecting between two inputs based on select signal. +//- module \$mux (A, B, S, Y); parameter WIDTH = 0; @@ -1396,6 +1540,13 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $demux (A, S, Y) +//- +//- Demultiplexer i.e routing single input to several outputs based on select signal. +//- Unselected outputs are driven to zero. +//- module \$demux (A, S, Y); parameter WIDTH = 1; @@ -1460,6 +1611,14 @@ endmodule // -------------------------------------------------------- +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $tribuf (A, EN, Y) +//- +//- A tri-state buffer. +//- This buffer conditionally drives the output with the value of the input +//- based on the enable signal. +//- module \$tribuf (A, EN, Y); parameter WIDTH = 0;