Verilog 接收到信号异常\访问\违反xilinx

Verilog 接收到信号异常\访问\违反xilinx,verilog,xilinx,Verilog,Xilinx,我试图在verilog中制作一个算术逻辑单元,当我试图在ISim模拟器中进行模拟时,我收到了以下错误(在行为检查语法中没有报告错误): 错误:模拟器:754-接收到信号异常\访问\违规 代码如下: module alu( input [3:0] right, input [3:0] left, input [2:0] sel, input CarryIn, output reg CarryOut, output reg [3:0] out ); function [3:0] add; inp

我试图在verilog中制作一个算术逻辑单元,当我试图在ISim模拟器中进行模拟时,我收到了以下错误(在行为检查语法中没有报告错误):

错误:模拟器:754-接收到信号异常\访问\违规

代码如下:

module alu(
input [3:0] right,
input [3:0] left,
input [2:0] sel,
input CarryIn,
output reg CarryOut,
output reg [3:0] out
);


function [3:0] add;
input [3:0] a;
input [3:0] b;
input CarryIn;
assign add = a + b + CarryIn;
endfunction

function [3:0] substract;
input [3:0] a;
input [3:0] b;
input CarryIn;
assign subtract = a - b + (~CarryIn);
endfunction

function [3:0] AND;
input [3:0] a;
input [3:0] b;
assign AND = {1'b0 , a & b};
endfunction

function [3:0] OR;
input [3:0] a;
input [3:0] b;
assign OR = {1'b0 , a | b};
endfunction

function [3:0] XOR;
input [3:0] a;
input [3:0] b;
assign XOR = {1'b0 , a ^ b};
endfunction

function [3:0] increment;
input [3:0] a;
assign increment = a + 1;
endfunction

function [3:0] left_shift;
input [3:0] a;
assign left_shift = a << 1;
endfunction

function [3:0] right_shift;
input [3:0] a;
assign right_shift = a >> 1;
endfunction

always @ (left or right or sel) begin
case (sel) 
0 : {CarryOut , out} = add(left,right,CarryIn); 
1 : {CarryOut , out} = substract(left,right,CarryIn); 
2 : {CarryOut , out} = AND(left,right); 
3 : {CarryOut , out} = OR(left,right); 
4 : {CarryOut , out} = XOR(left,right) ;
5 : {CarryOut , out} = increment(left); 
6 :       begin
      CarryOut = left[3]; 
         out = left_shift(left);
         end
7 :       begin
      CarryOut = left[0]; 
         out = right_shift(left);
      end            
default : {CarryOut , out} = {1'b0,left};
endcase
                     end
endmodule
模块alu(
输入[3:0]正确,
左输入[3:0],
输入[2:0]选择,
输入CarryIn,
输出寄存器执行,
输出寄存器[3:0]输出
);
函数[3:0]添加;
输入[3:0]a;
输入[3:0]b;
输入夹带;
分配add=a+b+CarryIn;
端功能
函数[3:0]减法;
输入[3:0]a;
输入[3:0]b;
输入夹带;
赋值减法=a-b+(~CarryIn);
端功能
函数[3:0]和;
输入[3:0]a;
输入[3:0]b;
赋值并={1'b0,a&b};
端功能
函数[3:0]或;
输入[3:0]a;
输入[3:0]b;
赋值或={1'b0,a | b};
端功能
函数[3:0]XOR;
输入[3:0]a;
输入[3:0]b;
赋值XOR={1'b0,a^b};
端功能
函数[3:0]增量;
输入[3:0]a;
分配增量=a+1;
端功能
功能[3:0]左移;
输入[3:0]a;
分配左移位=a>1;
端功能
始终@(左、右或sel)开始
案例(sel)
0:{CarryOut,out}=add(左、右、CarryIn);
1:{CarryOut,out}=减法(左,右,CarryIn);
2:{carrout,out}=和(左,右);
3:{CarryOut,out}=或(左、右);
4:{CarryOut,out}=XOR(左,右);
5:{carrout,out}=增量(左);
6:开始
结转=左[3];
输出=左移位(左);
结束
7:开始
结转=左[0];
out=右移(左移);
结束
默认值:{CarryOut,out}={1'b0,left};
尾声
结束
端模

有什么想法吗

从所有函数中删除关键字
assign
<代码>分配语句用于只应在
模块
中声明的连续分配;不是
任务
功能
初始
始终

还有一个拼写错误。有几个地方有“减法”,应该是“减法”


您的敏感度列表中也缺少
CarryIn
。如果您的敏感度列表不完整,它将推断出复杂的锁存逻辑。更好的方法是,切换到IEEE 1364-2001编码样式,并使用
always@(*)
always@*
而不是
always@(左或右或sel或CarryIn)
。它们自动构造组合逻辑的灵敏度列表。

发生这种情况的原因之一是模拟器不理解语法。 我在VIVADO中遇到了类似的问题,因为我在编写verilog语法时犯了一个愚蠢的错误。对于verilog中的连接,我错误地使用了“:”而不是“,”。这导致了同样的问题。要准确找出是哪个模块导致了问题,最好查看tcl控制台消息。导致问题的模块只是在编译了此消息显示的模块之后


这是愚蠢的,但有时可能需要很多时间才能弄清楚

@user3507563,旁注:您在个人资料中提出了三个问题,但未接受任何回答。如果您对答案感到满意,则应单击投票控件下方的“接受答案”。它让其他用户知道答案实际上解决了问题,您不需要寻找进一步的答案,并给您和答案打分。