efda4e86-a85f-11ed-bfe3-dac502259ad0.png

技术改变生活。最近一段时间,OpenAI旗下的ChatGPT大火。根据官网自身的介绍(见图1),其是由 OpenAI 提出的大型预训练语言模型,使用了许多深度学习技术,可以生成文本内容,也可以进行文本分类、问答等任务。GPT 与传统的机器学习方法不同,它通过预先训练来学习大量文本数据,然后可以进行各种自然语言处理任务。

efda4e86-a85f-11ed-bfe3-dac502259ad0.png

图1  ChatGPT官网简介(来自https://openai.com/blog/chatgpt/)

 

刚看到这个信息的时候,小编就联想到了咱们身为IC工程师,有没有方法可以利用这个工具,提升效率进一步解放生产力?首先想到的就是,日常工作中会用到的各种脚本,包括但不限于shell/python/perl/makefile,实现特定功能,帮助流程自动化,提升效率。如果这个工具真的好用,那么对于工程师群体应该帮助很大!按照官网的介绍,工程师们完全可以把所要实现的逻辑步骤用自然语言描述清楚,然后ChatGPT会翻译出满足相应要求的代码进行实现。话不多说,如图2直接上干货进行测试!

 

effd8e0a-a85f-11ed-bfe3-dac502259ad0.png

图2  简单shell脚本自动生成

测试效果简直太惊艳了,不但进行了背景知识的介绍,实现过程更是注释清晰明了,甚至补充了代码的注意事项,谁能不爱这个工具呢!!!随后小编也试过用perl和python来写脚本,效果如下。

要求:写一个perl脚本,文件名叫test.pl,查找当前目录下包含“abc”字符串的文件,将这些文件备份,备份名称为在原名称后加“_bak”。备份完后,原有的文件中包含“abc”字符串前插入一行字符串,“1st,所有备份的文件不进行此修改。调用同目录下另一个叫做mkdir.pl的脚本。mkdir.pl脚本的内容,在当前目录下建立叫做“test_bak”的文件夹,将之前备份的带“_bak”的文件移动到这里面。详情见图3.

 

f010d2c6-a85f-11ed-bfe3-dac502259ad0.png

 

f023baa8-a85f-11ed-bfe3-dac502259ad0.png

要求:写一个python脚本,文件名叫test.py,查找当前目录下包含“abc”字符串的文件,将这些文件备份,备份名称为在原名称后加“_bak”。备份完后,原有的文件中包含“abc”字符串前插入一行字符串,“1st, 所有备份的文件不进行此修改。调用同目录下另一个叫做mkdir.py的脚本。mkdir.py脚本的内容,在当前目录下建立叫做“test_bak”的文件夹,将之前备份的带“_bak”的文件移动到这里面。详情见图4。

 

f034efbc-a85f-11ed-bfe3-dac502259ad0.png

f04f82dc-a85f-11ed-bfe3-dac502259ad0.png

哈哈,继续发挥想象,能不能写verilog呢?下面这段是ChatGPT写的简单APB总线接口模块。图太长,直接贴出代码了。

module apb_reg_if (    input  wire        pclk,


    input  wire        presetn,


    input  wire [31:0] paddr,

    input  wire [31:0] pwdata,
    output wire        psel,
    output wire        penable,
    output wire        pwrite,
    output wire [31:0] prdata
);
// 地址和数据宽度可配置的寄存器
reg [31:0] regs [0:31];
parameter ADDR_WIDTH = 5, DATA_WIDTH = 32;
// 根据地址选择寄存器
always @(paddr) begin
    psel <= paddr[ADDR_WIDTH - 1:0] == 0;
end
// 寄存器读写
always @(posedge pclk or negedge presetn) begin
if (!presetn) begin
    // 复位寄存器
    for (int i = 0; i < 32; i++)
        regs[i] <= 0;
end
else if (psel && penable) begin
    if (pwrite) begin
        // 写入数据到寄存器
        regs[paddr[ADDR_WIDTH - 1:0]] <= pwdata[DATA_WIDTH - 1:0];
    end
    else begin
        // 读取寄存器数据
        prdata <= {DATA_WIDTH{psel}} & regs[paddr[ADDR_WIDTH - 1:0]];
    end
end
end
endmodule

 

一眼看上去,貌似没有什么问题。惊喜,继续挑战,写点验证环境,以下是部分代码。

class apb_reg_env extends uvm_env;
    `uvm_component_utils(apb_reg_env)
    apb_reg_if apb_reg_if;
apb_reg_tc apb_reg_tc;
function new(string name = "apb_reg_env", uvm_component parent = null);
    super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
    // 创建测试设计实例
    apb_reg_if = apb_reg_if::create("apb_reg_if", this);
    // 创建并配置测试用例
    apb_reg_tc = apb_reg_tc::create("apb_reg_tc", this);
    apb_reg_tc.set_config_object(this);
endfunction
virtual function void run_phase(uvm_phase phase);
    // 运行测试并收集结果
    apb_reg_tc.start(null);
    apb_reg_tc.finish(null);
endfunction

endclass

同样的,效果很让人惊艳!!此外,小编还尝试了提论问题让ChatGPT写小作文回答、写爬虫等也是可行的。下面是关于这个工具的一些思考:

  1. 能够做到按照言语要求给出代码,对于固定结构的模块或者功能,帮助会很大。
  2. 能够详细的为代码添加描述性注释。
  3. 言语描述越精确,细节丰富,相应生成的代码准确度越高。
  4. 生成的代码正确性不能保证100%,还是需要人为实际检查运行。
  5. 对于初级工程师,效率可以大大滴提升!!

总之,这个工具太让人惊艳了,小编个人认为这是具有划时代意义的,甚至可以说降低了各行各业的编程门槛,让普通人也可以更容易的接触编程。网上如何注册的教程很多,今天小编就不在这里放了。不知大家还有没有奇妙的想法,可以和这个工具结合,碰撞出更多创新的火花呢?

(文章来源:处芯积律)

Loading

发表回复