I am confused about why UVM has two separate classes: uvm_transaction and uvm_sequence_item.
If uvm_sequence_item only adds some extra features over uvm_transaction, then why didn’t the UVM creators directly include those features inside uvm_transaction itself?
There must be some architectural or practical reason behind creating two different classes instead of one.
Is uvm_transaction intended to be used separately in some specific scenarios? If yes, then in what kind of real verification scenarios would engineers use uvm_transaction instead of uvm_sequence_item?
The problem here is the UVM was designed by committee and in this case multiple committees that didn’t communicate with each other. The UVM started out as the Advanced Verification Methodology (AVM), which which implemented the transaction level modeling interface from SystemC (TLM 1.0). It created the.avm_transaction class.
Then, another committee took the AVM and developed the Open Verification Methodology (OVM). OVM introduced the concept of sequences, but instead of integrating them with the existing TLM, it created a separate branch and introduced ovm_sequence_item, which extends from ovm_transaction_item. All of these concepts were later carried forward into the UVM. By the way, there’s a very good paper suggesting that sequences should be implemented using straight TLM 2.0.