Следующий код должен проверять значение 'e' такое, что gcd (h, e) = 1. Где 1
module great(p,q,e,d);
input p,q;
output e,d;
reg e,d;
h=((p-1)*(q-1));
always
begin
for(e=2;e<h;e=e+1)
begin
g1=gcd(h,e);
if (g1==1)
return e;
Если под «возвратом значения» вы имеете в виду выдачу значения, которое можно использовать в другом модуле, вы должны использовать вывод этого модуля в качестве «возвращаемого» значения. Но даже игнорируя return e
, я не думаю, что ваш код будет работать, если вы попытаетесь его запустить, потому что он слишком похож на язык программирования. Есть несколько серьезных ошибок:
Вы уже объявили output e,d
, поэтому вы не можете объявить два reg
с одним и тем же именем. Вместо этого вы, вероятно, захотите output reg e,d
.
Вы не объявили тип для h
или g1
.
for
для e
, но e
никогда не может быть ничем иным, кроме 0
или 1
, потому что вы не установили для него размер, поэтому по умолчанию он имеет длину всего 1 бит. Даже если он был достаточно большим, чтобы вы могли увеличить его после 1
, по умолчанию это тип wire
, и вы не можете напрямую делать такие приращения в wire
.gcd
- это какой-то модуль, который вы сделали где-то в другом месте, но это не то, как вы соединяете модули вместе. Вы не можете называть это функцией. Вы должны использовать wire
и reg
для соединения входов и выходов двух модулей вместе, почти так же, как вы подключаете компоненты.Во всяком случае, это то, что мне больше всего запомнилось. Я думаю, вы кодируете свой Verilog, как если бы это был Python, и это является причиной этих недоразумений. Verilog очень и очень отличается.
Добро пожаловать в stackoverflow. Уделите несколько минут, чтобы прочитать как задать вопрос. Это поможет вам получить ответ на этот вопрос. В общем, постарайтесь дать читателю возможность понять, о чем вы спрашиваете. В этом случае могут помочь некоторые отступы вместе с тем, что вы пробовали, что он делал и что вы хотите от него делать.