murmel1 0 26 декабря, 2008 Опубликовано 26 декабря, 2008 (изменено) · Жалоба Добрый день ! Читая стандарт и экспериментируя на SV я так и не понял, есть ли возможность в интерфейс модуля подставлять ПАРАМЕТРИЧЕСКИЕ интерфейсы, то есть что-то вроде: module my_module ( input clk, reset, avalon_interface.master # ( .DATA_WIDTH(32), .ADDR_WIDTH(4)) ) ... endmodule Например, я часто использую для внутренних шин авалон, но у разных модулей разная ширина адресного сигнала. Пока, единственное, что приходит мне на ум - это переопределение `DEFINE, но это не красиво, и я не уверен, что так можно делать. А копировать интерфейсы для разных модулей: avalon_interface_DATA32_ADDR4, avalon_interface_DATA32_ADDR5, avalon_interface_DATA32_ADDR6... совсем некрасиво. Кто-нибудь знает решение ? Спасибо Изменено 26 декабря, 2008 пользователем murmel1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 декабря, 2008 Опубликовано 27 декабря, 2008 · Жалоба Кто-нибудь знает решение ? дык в стандарте же написано. Правда синтезируемость не гарантирую %) interface pipa_if #(parameter pA_W = 32, pD_W = 32) (clk, reset); input logic clk ; input logic reset; logic [pA_W-1:0] addr; logic [pD_W-1:0] data; modport slave (input clk, reset, addr, output data); endinterface module sub (interface intf); logic [intf.pA_W-1:0] addr; logic [intf.pD_W-1:0] data; assign addr = intf.addr; assign intf.data = data ; always_ff @(posedge intf.clk or posedge intf.reset) begin if (intf.reset) data <= '0; else data <= addr + 1'b1; end endmodule module top (input clk, reset, [31:0] addr, output [31:0] data0, [15:0] data1, [7:0] data2 ); pipa_if #(32, 32) pipa_32_32_if(clk, reset); pipa_if #(32, 16) pipa_32_16_if(clk, reset); pipa_if #(32, 8) pipa_32_8_if(clk, reset); sub sub32 ( pipa_32_32_if ); sub sub16 ( pipa_32_16_if ); sub sub8 ( pipa_32_8_if ); assign data0 = pipa_32_32_if.data; assign data1 = pipa_32_16_if.data; assign data2 = pipa_32_8_if.data; assign pipa_32_32_if.addr = addr; assign pipa_32_16_if.addr = addr; assign pipa_32_8_if.addr = addr; endmodule // synthesis translate_off module tb; bit clk, reset; bit [31:0] addr; bit [31:0] data0; bit [15:0] data1; bit [7:0] data2; top top (.*); initial begin : clk_gen clk = 1'b0; #5 forever #5 clk = ~clk; end initial begin : reset_gen reset = 1'b1; repeat (2) @(negedge clk); reset = 1'b0; end assign addr = 0; endmodule // synthesis translate_on Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmel1 0 27 декабря, 2008 Опубликовано 27 декабря, 2008 · Жалоба Это не то что нужно. В вашем примере у этого модуля: module sub (interface intf); У интерфейса intf ширина сигналов определяется параметрами интерфейса по умолчанию. А у этого все порты прописаны вручную: module top (input clk, reset, [31:0] addr, output [31:0] data0, [15:0] data1, [7:0] data2 ); Меня же интересует именно сокращение текста в описании входов и выходов модуля. То есть, что бы интерфейс везде использовался один, но с разными ширинами. Чтобы сразу было видно, какая у него ширина адреса (и др.), и не надо было писать это вручную (100% где-нибудь забудешь) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 декабря, 2008 Опубликовано 27 декабря, 2008 · Жалоба У интерфейса intf ширина сигналов определяется параметрами интерфейса по умолчанию. ширина определяется при назначении интерфейса, см рисунок в атаче. Запустите сами симулятор если не верите. Меня же интересует именно сокращение текста в описании входов и выходов модуля. То есть, что бы интерфейс везде использовался один, но с разными ширинами. а пример это разве не сокращение текста? я вообще отказался от использования интерфейсов для синтеза, пока не будет их нормальной поддержки во всех средствах синтеза %) Сейчас за меня эту работу делают скрипты и редактор. Начнем с начала. Инстанс интерфейса - это объект статический, он либо есть либо его нет. И этот объект имеет статические, не изменяемые параметры. Когда вы "передаете" интерфейс по иерархии вы, по сути, передаете указатель на этот интерфейс. Судя по вашей фразе вы хотите иметь в своем коде один инстанс интерфейса и передавать в модули указатели на его, как бы так сказать, "части" ? ну и как вы себе это представляете ? :) Есть в интерфейсе 32 разрядная шина и вы передаете указатель на ее 8 ми битный кусочек в модуль ? :)) Если вы имели в виду "То есть, что бы декларация интерфейса везде использовалась одна, но с разными ширинами" то этот пример я вам привел. Декларация одна, но 3 инстанса этой декларации интерфейса. указатели на который передаются в подмодули. И каждый модуль видит только тот интерфейс который должен видеть. Сигналы подмодулей я специально ввел что бы показать вам что ширины будут определяться параметрами интерфейса на который передан указатель. Если делать кратко то можно без них. Взаимодействия между этими инстансами интерфейса это уж ручками %) На топе шины выведены для возможности синтеза. Вас же синтез интересует? Из топ модуля интерфейсы наружу торчать не могут. По крайней мере в ква. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться