Зарегистрируйте тип доступа к слою абстракции

Я пишу набор моделей регистров, используя класс uvm_reg. Размер отдельного регистра 8-битный. Блок регистров создан, чтобы содержать эти регистры:

class my_reg_block extends uvm_reg_block;
  my_byte_reg reg_00;
  my_byte_reg reg_01;
  my_byte_reg reg_10;
  my_byte_reg reg_11;
  ...
  // build()
  my_map.add_reg(reg_00, 32'h0000 /*offset*/, ""RW");
  my_map.add_reg(reg_01, 32'h0001 /*offset*/, ""RW");
  my_map.add_reg(reg_10, 32'h0002 /*offset*/, ""RW");
  my_map.add_reg(reg_11, 32'h0003 /*offset*/, ""RW");
  ...

У меня есть регистровый адаптер, который будет переводить чтение/запись в шинную транзакцию. Итак, я могу сделать это внутри своей последовательности:

reg_00.write(status, 'hff, .parent(this));

Шинная транзакция будет выполнять запись в этот конкретный регистр: reg_00.

Моя проблема в том, что на шине есть byte_enable, которые позволяют ей записывать в 4 регистра в режиме двойного слова. Используя существующую модель регистров, описанную выше, можно ли одновременно записывать/читать в 4 регистра? Или мне нужно создать другой набор регистров (с 32-битным размером)? Это будет что-то вроде этого псевдокода:

{reg_11,reg_10,reg_01,reg_00}.write(status, 'hffffffff, .parent(this));

Любое предложение?


person AldoT    schedule 06.10.2015    source источник
comment
Кажется, вы ищете пакетную передачу. Может помочь эта ссылка.   -  person sharvil111    schedule 06.10.2015


Ответы (1)


вы можете попробовать передать адаптеру дополнительную информацию, такую ​​как byte_enable, используя аргумент расширения в функции записи. Затем адаптер может принять соответствующее решение, является ли это допустимой транзакцией двойного слова, и соответствующим образом назначить поля транзакции шины. см. частичный пример ниже

virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
bus_trans            trans;
uvm_reg_item            item;
regtrans_params         params;


item                    = get_item();
trans                   = bus_trans::type_id::create("trans");

if(item.extension == null) 
  `uvm_fatal("", "item.extension==null !!")
if(!$cast(params, item.extension))
  `uvm_fatal("", "FAILED $cast(params, item.extension) !!")

trans.dst_chip_addr              = params.chip_addr;

в последовательности:

block.reg_00.write(status, 32'hfffffffff .extension(params));
person Meir    schedule 06.10.2015