我正在尝试在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
有什么想法吗?
答案 0 :(得分:1)
从您的所有功能中删除关键字assign
。 assign
语句用于连续分配,只应在module
中声明;不是task
,function
,initial
或always
。
也有拼写错误。有几个地方你有“sub s 道”,应该“减去”。
您的敏感度列表中也缺少CarryIn
。如果您的灵敏度列表不完整,它将推断出复杂的锁存逻辑。更好的是,切换到IEEE 1364-2001编码样式并使用always @(*)
或always @*
代替always @ (left or right or sel or CarryIn)
。它们自动构建组合逻辑的灵敏度列表。
答案 1 :(得分:0)
发生这种情况的原因之一是模拟器不了解语法。 在编写verilog语法时,我在VIVADO中遇到了类似的问题,这是一个愚蠢的错误。对于在verilog中的连接,我错误地使用了“:”而不是“,”。那引起了同样的问题。要准确找出导致问题的模块,最好查看tcl控制台消息。导致该问题的模块仅在编译此消息显示的模块之后即可。
这很愚蠢,但有时可能要花很多时间才能弄清楚。