2016-05-06 5 views
-1

Я пытаюсь изменить код C++ в Verilog HDL. Я хочу написать модуль, который изменяет один из его входов. (некоторые, как вызов по ссылке в C++) , поскольку я знаю, что нет способа написать вызов ссылочным модулем в verilog (я не могу использовать systemverilog) Вот код, который я написал, и он работает. есть ли лучшие способы сделать это ?! мой problme в том, что регистр, который я хочу вызвать по ссылке, представляет собой большой массив. таким образом дублирует регистры и имеет большую стоимость.вызов по ссылке в verilog код

module testbench(); 
reg a; 
wire b; 
reg clk; 
initial begin 
    a = 0; 
    clk = 0; 
    #10 
    clk = 1; 
end 

test test_instance(
    .a(a), 
    .clk(clk), 
    .aOut(b) 
    ); 

[email protected](*)begin 
     a = b; 
end 
endmodule 



module test(
    input a, 
    input clk, 
    output reg aOut 
    ); 
    always @(posedge clk) begin 
     if (a == 0)begin 
      a = 1; 
      aOut = a; 
     end 
    end 

endmodule 
+3

Вам нужно предоставить гораздо больше информации о ваших «требованиях». Я предполагаю, что вы пытаетесь перевести программный алгоритм в аппаратное обеспечение. Прямой перевод процедурного потока, скорее всего, не сработает. Кроме того, почему вы не можете использовать SystemVerilog? –

+0

Да, я пытаюсь перевести программный алгоритм в hdl. алгоритм настолько сложный, что я не могу изменить его на аппаратное обеспечение. поэтому я shoul меняю его по строкам на hdl-код – Mehdi

+0

Учитывая, что ваш ответ ниже («логическая область»), похоже, что изменение вашего алгоритма на аппаратное обеспечение - это то, что вы пытаетесь сделать. И когда вы пишете HDL-код для реализации на FPGA или IC, проектирование аппаратного обеспечения - это то, что вы делаете. Вам нужно начать преобразовывать свой алгоритм в аппаратное обеспечение, а затем закодировать его в HDL. HDL - это не способ избежать проектирования оборудования. Имеются инструменты, которые преобразуют код C в код HDL/аппаратное обеспечение, но они не являются быстрым решением - вам нужно довольно много практики, используя их, прежде чем вы получите результаты, которые вы после. –

ответ

1

Verilog не программное обеспечение язык программирования; это аппаратное обеспечение язык описания. Входы в модуль представляют собой куски металла (провода, дорожки, штифты); выходы модуля являются кусками металла. Если вам нужен порт, который является как входом, так и выходом, вы можете использовать inout. Однако лучше всего избегать портов inout; обычно гораздо лучше использовать отдельные входы и выходы.

A Verilog модуль не является программной функцией. Ничто не копируется на входные данные; ничего не копируется с выходов. Модуль Verilog - это кусок аппаратного обеспечения: он имеет входы (куски металлической несущей информации) и выходы (куски металлической несущей информации).

Вы имеете право сказать, что в SystemVerilog вы можете использовать либо пошив, либо передачу по ссылке. Если вы хотите передать большую структуру данных в функцию или в/из задачи, то передача по ссылке может сэкономить время моделирования.

+0

thanx, я знаю. Ты прав. как вы можете видеть, у меня есть два разных ввода и ввода модуля для этого. но я хочу знать, есть ли лучший способ сделать это с небольшой стоимостью. – Mehdi

+2

На самом деле SystemVerilog имеет пропуск для ссылок на порты модулей. Но это не поможет этому человеку. –

+0

Спасибо @ dave_59. На самом деле, звонит какой-то финт-звонок. Я лучше пересмотрю это. –

0

Посредством ссылки по адресу, поэтому, чтобы перевести это на hdl непосредственно, вам необходимо будет предоставить способ для модуля получить на этой шине и выполнить транзакции на основе этого адреса.

Или лучше, если вам это нужно как вход, возьмите каждый из элементов в структуре и сделайте из них отдельные входы. Если он передается по ссылке, потому что он является выходным или является также выходом, то вы создаете отдельные выходы для каждого из элементов в структуре. Затем модуль различает входную версию этого подпункта и выходную версию этого подэлемента.

my.thing.x = my.thing.x + 1;

становится чем-то вроде

my_thing_x_output = my_thing_x_input + 1;

+0

Вы уверены, что это работает?! вы можете воссоздать мой образец ?! – Mehdi

+0

Как вы думаете, аппаратные или программные модули/функции работают? входы и выходы, а модуль/функция изменяет вход для вывода. почему это не работает? –

Смежные вопросы