Цитата
Кроме модуля, в котором эти регистры объявлены, имеется второй модуль, в котором они используются. И вот чего я не могу понять: как объявить конкретные поля под конкретные значения в одном модуле и потом передать эти поля как часть регистра в другой модуль?
Я обычно сохраняю регистры, но не пользуюсь численными значениями в объявлении полей. Вместо хард литералов я использую макро. С помощью макро разбиваю регистры на рабочие вектора.
Код
assign stts_overflow_fifo = Reg_Status_r[31:25];
assign stts_op_code = Reg_Status_r[24:17];
assign stts_status = Reg_Status_r[16:9];
assign stts_add_inf = Reg_Status_r[8:0]
Превращается в:
Код
assign stts_overflow_fifo = Reg_Status_r[`OVERFLOW_FIFO_HI:`OVERFLOW_FIFO_LO];
assign stts_op_code = Reg_Status_r[`OPCODE_HI:`OPCODE_LO];
assign stts_status = Reg_Status_r[`STATUS_HI:`STATUS_LO];
assign stts_add_inf = Reg_Status_r[`ADD_INTF_HI:`ADD_INTF_LO]
Естественно, данная операция осуществляется во всех модулях, где регистр (Reg_Status_r) используется данным образом.
Как вариант можно использовать "опорный" бит и ширину поля.
Ну или второй вариант, уже предложенный здесь - в модуле, куда нужно передать сигналы, в качестве входов/выходов задать сразу нужные наименования и ширины векторов.
Цитата
Агитирую коллег поменьше увлекаться SV
Поддерживаю. По этой же причине я предпочитаю писать Gate-Level везде, где это возможно, поскольку так Netlist остаётся похожим на RTL-код, в отличие от бихевиорального описания.
Цитата
Посмотрите, пожалуйста, верно ли
Ширину векторов забыли указать при определении.
Цитата
А кстати, обязательно ли имена полей должны совпадать с именами портов?
Нет. Компилятору нужно лишь точно заданное соответствие подключений. Имена переменных - это для вас и для тех, кто будет с вашим кодом работать.