亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你好,請問為什么這個Verilog編的階乘函數編譯通不過?。???

你好,請問為什么這個Verilog編的階乘函數編譯通不過啊???

拉風的咖菲貓 2023-04-20 19:15:35
總是提示:loop with non-constant loop condition must terminate within 250 iterations.代碼如下:module funtest(clk,rst,n,q);input clk,rst;input [3:0]n;output reg[31:0]q;always @(posedge clk)beginif(rst)q<=0;elsebeginq<=factorial(n);endendfunction [31:0] factorial;input [3:0]pram_n;reg [3:0]i=1;beginfactorial=pram_n?1:0;factorial=1;for(i=2;i<=pram_n;i=i+1)factorial=i*factorial;endendfunctionendmodule
查看完整描述

2 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

錯在第18行:reg [3:0]i=1; 應該分著寫:reg[31:0] i;begin之后寫i = 1;
function [31:0] factorial;
input[3:0] pram_n;
reg[3:0] i;//分開寫
begin
i = 1;
factorial=pram_n?1:0;
factorial=1;
for(i=2;i<=pram_n;i=i+1)
factorial=i*factorial;
end
endfunction 
原因是:always @(posedge clk)表示時序邏輯,其中引用了function factorial;那么初始定義reg i跟給它賦值的工作。在時序上,只能經兩個clk才能完成,一個clk用來初始化reg,另一個clk用于賦值。
另外,always的rst是組合邏輯,推薦規范寫法:
always @(posedge clk or negedge rst)
begin
if(!rst)
q<=0;
else
begin
q<=factorial(n);
end
end

查看完整回答
反對 回復 2023-04-23
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

for語句中的i<=pram_n出錯,pram_n要求是一個常數,否則不能編譯。你隨便改個常數試試就不會出現以上錯誤了。

查看完整回答
反對 回復 2023-04-23
  • 2 回答
  • 0 關注
  • 228 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號