Verilog HDL不';不允许将一个整型变量的值赋值给另一个整型变量

Verilog HDL不';不允许将一个整型变量的值赋值给另一个整型变量,verilog,xilinx-ise,Verilog,Xilinx Ise,我正在用Verilog为16*4 RAM编写代码。对于内存的每个二进制单元,我都使用SR触发器。最初,每个单元分配1'bx。我对循环使用整数,并存储要使用变量k访问的内存索引的值。Verilog不允许我为k分配循环变量的一个值 module memory(addr, read_data, rw, write_data, clk); // read_data is the data read // rw specifies read or write operation. 1 for rea

我正在用Verilog为16*4 RAM编写代码。对于内存的每个二进制单元,我都使用SR触发器。最初,每个单元分配1'bx。我对循环使用整数,并存储要使用变量k访问的内存索引的值。Verilog不允许我为k分配循环变量的一个值

   module memory(addr, read_data, rw, write_data, clk);
// read_data is the data read
// rw specifies read or write operation. 1 for read and 0 for write
// write data is the data to be written
// addr is the address to be accessed   

task SRFlipFlop;
input d,r,s,clk; // d is the value initially stored
output q;  
begin
case({s,r})
{1'b0,1'b0}: q=d;
{1'b0,1'b1}: q=1'b0;
{1'b1,1'b0}: q=1'b1;
{1'b1,1'b1}: q=1'bx;
endcase
end
endtask

task decoder;     // a 4 to 16 line decoder
input [3:0] A;
input E;
output [15:0] D;
if (!E)
    D <= 16'b0000000000000000;
else
    begin
        case (A)
            4'b0000 : D <= 16'b0000000000000001;
            4'b0001 : D <= 16'b0000000000000010;
            4'b0010 : D <= 16'b0000000000000100;
            4'b0011 : D <= 16'b0000000000001000;
            4'b0100 : D <= 16'b0000000000010000;
            4'b0101 : D <= 16'b0000000000100000;
            4'b0110 : D <= 16'b0000000001000000;
            4'b0111 : D <= 16'b0000000010000000;
            4'b1000 : D <= 16'b0000000100000000;
            4'b1001 : D <= 16'b0000001000000000;
            4'b1010 : D <= 16'b0000010000000000;
            4'b1011 : D <= 16'b0000100000000000;
            4'b1100 : D <= 16'b0001000000000000;
            4'b1101 : D <= 16'b0010000000000000;
            4'b1110 : D <= 16'b0100000000000000;
            4'b1111 : D <= 16'b1000000000000000;
        endcase
    end
endtask

output reg [3:0] read_data;
input [3:0] write_data, addr;
input rw, clk;
reg [3:0] memory [15:0];
reg [3:0] r [15:0];
reg [3:0] s [15:0];
reg [3:0] select [15:0];
reg [15:0] out;
integer k;    // gives error
integer i,j;
initial 
  begin
    for (i = 0; i <= 15; i=i+1) 
        begin
            for (j = 0; j <= 3; j=j+1) 
                begin
                 memory[i][j] = 1'bx;
                 r[i][j] = 1'b0;
                 s[i][j] = 1'b0;
                 select[i][j] = 1'b0;
                end
        end
  end
  always @(rw or write_data or addr)  
  begin
     k = 16;
     decoder(addr, 1'b1, out);
     for (i = 0; i <= 15; i=i+1)
        begin
            if (out[i] == 1'b1)
                k = i;
        end
     for (i = 0; i <= 3; i=i+1)
        begin
            select[k][i] = 1'b1;
        end
     for (i = 0; i <= 3; i=i+1)
        begin
            s[k][i] = write_data[i] & !rw & select[k][i];
            r[k][i] = !write_data[i] & !rw & select[k][i];
        end 
  end
  always @(posedge clk)
  begin
   if (k == 16)
            begin
                for(i = 0; i <= 3; i=i+1) 
                    read_data[i] = 1'bx;
            end
        else
            for(i = 0; i <= 3; i=i+1) 
                begin
                  SRFlipFlop(memory[k][i],r[k][i],s[k][i],clk,memory[k][i]);
                  read_data[i] = memory[k][i];
                end
  end
endmodule
模块存储器(地址、读取数据、rw、写入数据、时钟);
//read_data是读取的数据
//rw指定读或写操作。1表示读取,0表示写入
//写入数据是要写入的数据
//addr是要访问的地址
任务触发器;
输入d、r、s、clk;//d是最初存储的值
输出q;
开始
格({s,r})
{1'b0,1'b0}:q=d;
{1'b0,1'b1}:q=1'b0;
{1'b1,1'b0}:q=1'b1;
{1'b1,1'b1}:q=1'bx;
尾声
结束
结束任务
任务解码器;//一种4到16行的解码器
输入[3:0]A;
输入E;
输出[15:0]D;
如果(!E)

正如@sharvill111在他们的评论中指出的那样,你有很多违法行为

  • 不能在
    始终
    块中实例化模块。使用
    生成
    块,或单独实例化它们
  • 不能同时具有边缘触发和级别敏感的敏感度列表。如果要生成寄存器/顺序逻辑,请使用
    always@(posedge clk)
    (必要时使用
    If
    语句)。如果需要组合逻辑,请使用
    始终@(*)

  • 使用非阻塞分配(
    decoder(addr,1'b1,out);
    是什么意思?如果你像那样实例化模块,那么它是非法的。另外,
    SRFlipFlop(内存[k][i]、r[k][i]、s[k][i]、clk、内存[k][i])
    似乎是模块。这是完全非法的。鼓励使用
    始终*
    。这些是
    任务
    。我刚刚在代码中添加了这些。好吧,我们不能在
    始终
    块中使用模块。即使我从第一个
    始终
    块中删除
    posedge clk
    ,我也会得到错误
    错误:Xst:528-Multi-source in Unit on signal
    我已经编辑了代码,并在其中添加了
    SRFlipFlop
    解码器
    任务。
    ERROR:Xst:528 - Multi-source in Unit <memory> on signal <_const0017>