信号EXCEPTION_ACCESS_VIOLATION收到了xilinx

时间:2014-05-13 14:52:42

标签: verilog xilinx

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

ERROR:Simulator:754 - Signal EXCEPTION_ACCESS_VIOLATION received

以下是代码:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

从您的所有功能中删除关键字assignassign语句用于连续分配,只应在module中声明;不是taskfunctioninitialalways

也有拼写错误。有几个地方你有“sub s 道”,应该“减去”。

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

答案 1 :(得分:0)

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

这很愚蠢,但有时可能要花很多时间才能弄清楚。