aobula Posted November 17, 2011 Report Share Posted November 17, 2011 Hi, We are using UVM-1.1 and trying to deploy RAL for modelling memory/register space. We have to implement a write to a slave module (memory write) where the interface width (64) is smaller than the memory width(512). The transactions will have a single address phase and a multiple data phases. We have multiple memory with different widths (64, 128, 256, 512 etc). For a memory with width 256 should have one address phase and 4 data phase, anything other than 4 data phase is illegal transaction. So the ral mem is modelled as 256 bits wide and the default map is set as 64bit . When calling model.mem.write(), the "do_bus_write" task inside uvm_reg_map.svh is splitting the memory width (say 256 bit) data to multiple data of 64 bits (set in default map) and address cycles. These appear in the executeSingle task in the adapter as four individual transactions and we are not able to interpret it as a part of a burst (access to a memory width of 256) or 4 individual access to memory/register width of 64. So, in the RAL adapter file, we would like to see the data as such (not split up to multiple transactions) so that we could implement the driver accordingly. Is there any way (functions to be overridden/callbacks/flags ??) to get this behavior? Thanks, Akilesh Quote Link to comment Share on other sites More sharing options...
svarun Posted December 8, 2011 Report Share Posted December 8, 2011 Just before adding the memory to your map, re-"create" the map with the width that corresponds to the width of your memory block. If you have many blocks with multiple widths then you would have create the map multiple times with different widths (n_bits). this.default_map = create_map("", 0, 64, UVM_LITTLE_ENDIAN); // For your memory this.default_map.add_mem(this.DMA_RAM1, `UVM_REG_ADDR_WIDTH'h2000, "RW", 0); this.default_map = create_map("", 0, 128, UVM_LITTLE_ENDIAN); // For your memory this.default_map.add_mem(this.DMA_RAM2, `UVM_REG_ADDR_WIDTH'h2000, "RW", 0); this.default_map = create_map("", 0, 256, UVM_LITTLE_ENDIAN); // For your memory this.default_map.add_mem(this.DMA_RAM3, `UVM_REG_ADDR_WIDTH'h2000, "RW", 0); this.default_map = create_map("", 0, 512, UVM_LITTLE_ENDIAN); // For your memory this.default_map.add_mem(this.DMA_RAM4, `UVM_REG_ADDR_WIDTH'h2000, "RW", 0); Thanks, Varun Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.