VHDL vs. SystemC
Code Comparison Sheet
Bold: Reserved Word
Italic: User_Defined
Text
Task |
VHDL |
SystemC |
Basic Model
Structure |
library IEEE; use
IEEE.std_logic_1164.all; entity my_model is
port(
input1: in
STD_LOGIC;
input2: in STD_LOGIC;
output1: out STD_LOGIC;
output2: out
STD_LOGIC;
); end my_model; architecture my_arch of my_model is begin process( input1, input2)
variable my_var1,my_var2: STD_LOGIC; begin
my_var1 := not input1;
my_var2 := not input2;
output1 <= input1 and my_var2;
output2 <= input2 and my_var1; end
process; end my_arch; |
#include “systemc.h” SC_MODULE
(my_model) {
sc_in<sc_logic> input1;
sc_in<sc_logic> input2;
sc_out<sc_logic> output1; sc_out<sc_logic>
output2;
SC_CTOR
(my_model)
{
SC_METHOD
( process );
sensitive << input1 << input2;
}
void process(
)
{
sc_logic my_var1, my_var2;
my_var1 = ~input1;
my_var2 = ~input2;
output1 = input1 & my_var2;
output2 = input2 & my_var1;
} }; |
Logic
Values |
‘X’, ‘0’, ‘1’,
‘Z’ |
“SC_LOGIC_X” , “SC_LOGIC_0” “SC_LOGIC_1”, “SC_LOGIC_Z” |
Variable:Type Logic Bit |
variable my_bit:
STD_LOGIC; |
sc_logic my_bit; |
variable: 3-bit Logic
Vector |
variable my_vector: STD_LOGIC_VECTOR(2 downto
0) ; |
sc_lv<3> my_vector; |
Signal of Type Logic |
signal
my_signal: STD_LOGIC; |
sc_signal<sc_logic>
my_signal; |
Signal for a 3-bit Logic
Vector |
signal
my_signal: STD_LOGIC_VECTOR (2
downto 0); |
sc_signal<sc_lv<3> >
my_signal; |
Input Ports – Logic Type |
input1: in
STD_LOGIC; input2,input3,input4: in
STD_LOGIC; |
sc_in<sc_logic>
input1; sc_in<sc_logic>
input1,input2,input3; |
Output Ports – Logic Type |
output1: out
STD_LOGIC; output2,output3,output4: out
STD_LOGIC; |
sc_out<sc_logic>
output1; sc_out<sc_logic>
output1,output2,output3; |
Process & Sensitivity
List |
process( input1,
input2 ) |
SC_METHOD
( process ); sensitive << input1 << input2; |
Process: Positive
Edge- Triggered
|
[no predefined function-must use
this code] process(clk) . . . if ( clk’event and
clk = ‘1’) then . . . |
SC_METHOD
( process ); sensitive_pos << clk; |
Process: Negative Edge- Triggered
|
[no predefined function-must use
following code] process(clk) . . . if ( clk’event and
clk = ‘0’) then . . . |
SC_METHOD
( process ); sensitive_neg << clk; |
“Not” Input1
|
not input1 |
~input1 |
Input1 “AND”
Input2 |
…input1 and input2; |
…input1
& input2; |
Input1 “OR” Input2 |
…input1 or input2; |
…input1
| input2; |
Input1 “XOR” Input2 |
…input1 xor input2; |
…input1
^ input2; |
Input1 “NAND” Input2 |
…input1 nand input2; |
[no operator-must use 2 statements of
code] … input1 & input2; … ~input; |
Input1 “NOR” Input2 |
…input1 nor input2; |
[no operator-must use 2 statements of
code] … input1 | input2; … ~input; |
Input1 “XNOR” Input2 |
…input1 xnor input2; |
[no operator-must use 2 statements of
code] … input1 ^
input2; … ~input; |
Variable
Assignment |
var1 := input1 and
input2; |
var1 = input1 &
input2; |
Signal
Assignment |
sig1 <= input1 and
input2; |
sig1 = input1 &
input2; |
Accessing a Value From a
Port |
variable temp; temp = input1; |
sc_logic
temp; temp = input1.read( )
; |
Equality
Operator |
= example: if ( ENABLE = ‘1’) then |
== example:
if ( ENABLE ==
SC_LOGIC_1); |
Arithmetic Operations |
use
IEEE.std_logic_arith.all; … input1 = input1 +
1; input1 = input1 - 1; |
[no
header file for arithmetic on logic types, must convert to unsigned
integer type first] sc_uint
temp; temp = input1.read( )
; temp = temp + 1; temp = temp – 1; input1 = temp; |
If ... Else... Structure |
if(E=’1’) then Q = D; Q_P = not D; elsif(E=’0’)then Q_P = D; Q = not D; else Q = D; Q_P = not D; end if; |
if(E=’1’) { Q = D; Q_P = ~D; } elsif(E=’0’) { Q_P = D; Q = ~D; } else { Q = D; Q_P = ~D;} |
Switch/Case Statement |
case ctrl is when “0” => f <= a; when “1” => f <= b; end case; |
[illegal to use logic type in
switch statement – must use temp variable] sc_uint<2> temp = ctrl.read(); switch(temp) {
case 0: f = a; break;
case 1: f = b; break; } |